理论基础
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
509. 斐波那契数
1.代码
class Solution {
public:
int fib(int n) {
if (n <= 1) return n;
vector<int>f(n+1 , 0);
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
};
2.动规五部曲
1.确定递归数组和其下标含义
2.确定递推公式
3.dp数组如何初始化
4.确定遍历顺序
5.举例推导dp数组
70. 爬楼梯
1.代码
class Solution {
public:
int climbStairs(int n) {
vector<int>f(n + 5, 0);
f[1] = 1;
f[2] = 2;
if (n <= 2) return f[n];
for (int i = 3; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
};
2.动规五部曲
1.确定递归数组和其下标含义
2.确定递推公式
3.dp数组如何初始化
4.确定遍历顺序
5.举例推导dp数组
一般在前几个元素或后几个元素推导
746. 使用最小花费爬楼梯
1.代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int>f(cost.size() + 5, 0);
f[0] = 0;
f[1] = 0;
for (int i = 2; i <= cost.size(); i++) {
f[i]= min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]);
}
return f[cost.size()];
}
};
2.动规五部曲
1.确定递归数组和其下标 的含义
注:我们可以对dp数组开大一点的空间
dp[i]相当于在到达i层所花费的最小体力
2.确定递推公式
由题目可以看出来有两种到达i点的情况,结合f[i]的含义,
第一种:f[ i ] = f[i - 1] +cost[i - 1]
代表到达第i-1层的最小花费再加上到达i的花费就是最终的花费
第二种: f[ i ] = f[i - 2] +cost[i - 2]
代表到达i - 2层的最小花费再加上i - 2层到i层的花费就是到达i 层的花费
我们取最小值就是到达i层的最小花费了
f[ i ] = min (f[i ] = f[i - 1] +cost[i - 1], f[i ] = f[i - 2] +cost[i - 2])
3.dp数组如何初始化
由递推公式和从第一个元素推得出和题目说可以从下标0或下标为1开始进行,所以f[0] = 0, f[1] = 0;
4.确定遍历顺序
都是从前向后推,所以是从左到右
5.举例推导dp数组
一般用前面几个元素距离推导dp数组
比如第三个元素是终点,法f[2] = min(f[0] + cost[0],const[1]+cost[1]);