动态规划思想 / 步骤 :
- 先将 当前要求 总结成一个 精炼的 小问题 ,
- 然后 将 求解题目 转换为 求解N个 小问题 ,
- 每个小问题的 求解过程相同 ,但是 过程涉及 的 数据 是不同的 ,
- 例如第三个 小问题的 结果 也 会影响 第 四个 小问题 的 求解。(看情况保存结果)
class Solution {
public:
bool find(string str,vector<string>&k)
{
for (auto tem : k)
{
if (tem == str)
return true;
}
return false;
}
bool wordBreak(string s, vector<string>&wordDict) {
vector<bool> dp(s.length() + 1);
dp[0] = true;
for (int i = 1; i < s.length() + 1; i++)
{
for (int j = 0; j < i; j++)
{
if (dp[i - j - 1] && (find(s.substr(i - j - 1, j + 1), wordDict)))
{
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
};
三角形中最小路径之和
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.size() == 1)
return triangle[0][0];
for(int i = triangle.size()-2;i>= 0;i--)
{
for(int j = 0; j < triangle[i].size();j++)
{
triangle[i][j] += (triangle[i+1][j] < triangle[i+1][j+1]) ? triangle[i+1][j] : triangle[i+1][j+1];
}
}
return triangle[0][0];
}
};
class Solution {
public:
int uniquePaths(int m, int n) {
int arr[100][100];
for(int i = 0; i < m;i++)
for(int j = 0 ;j < n ;j++)
arr[i][j] = 1;
for(int i = 1;i < m;i++)
for(int j = 1;j < n;j++)
arr[i][j] = arr[i-1][j]+arr[i][j-1];
return arr[m-1][n-1];
}
};
01背包
子问题 :
子问题 : 在 x 个 物品中 选取 填满 容量为 y 的 容器 ,使其 价值最大
子问题之间关联 : 如果当前第 i 件 商品能 容纳 ,则判断是否 容纳 ,如果可以容纳
容纳后的总价值 = 利用容纳后剩余容量的 最大价值 + 第 i 件商品的价值
如果不容纳 ( 容量不够 , 或者容纳后价值 < 不容纳的价值)
不容纳的价值总价值 = 当前容量(x)下 的 能 选取 (i-1)件商品下的最大值
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算01背包问题的结果
* @param V int整型 背包的体积
* @param n int整型 物品的个数
* @param vw int整型vector<vector<>> 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
* @return int整型
*/
int knapsack(int V, int n, vector<vector<int> >& vw) {
vector<vector<int>> arr(n,vector<int>(V+1,0));
for(int i = 0 ; i < V+1 ; i++)
{
arr[0][i] = (i >= vw[0][0]) ? vw[0][1] : 0;
}
for(int i = 1 ; i < n;i++)
{
for(int j = 1 ; j < V+1 ;j++)
{
if(vw[i][0] <= j)
arr[i][j] = (arr[i-1][j] > arr[i-1][j - vw[i][0]]+vw[i][1]) ? arr[i-1][j] : arr[i-1][j - vw[i][0]]+vw[i][1];
else
arr[i][j] = arr[i-1][j];
}
}
return arr[n-1][V];
}
};
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
for(int i = 2 ; i < cost.size()+1; i++)
{
int tem = (cost[i-1] > cost[i-2]) ? cost[i-2] : cost[i-1];
if(i == cost.size())
return tem;
else
cost[i]+=tem;
}
return 0;
}
};