动态规划
- 五步分析
- 509. 斐波那契数
- 1. dp数组以及下标名义
- 2. 递归公式
- 3. dp数组如何初始化
- 4. 遍历顺序(背包问题先遍历背包还是物品)
- 5. 打印dp数组:debug
- 6.代码
- 70. 爬楼梯
- 1. dp数组以及下标名义
- 2. 递归公式
- 3. dp数组如何初始化
- 4. 遍历顺序
- 5. 代码:与斐波那契数列一样
- [746. 使用最小花费爬楼梯](https://leetcode.cn/problems/min-cost-climbing-stairs/submissions/436041869/)
- 1. dp数组以及下标名义
- 2. 递归公式
- 3. dp数组如何初始化
- 4. 遍历顺序(背包问题先遍历背包还是物品)
- 5. 打印dp数组:debug
- 6.代码
五步分析
- dp数组以及下标名义
- 递归公式
- dp数组如何初始化
- 遍历顺序(背包问题先遍历背包还是物品)
- 打印dp数组
509. 斐波那契数
1. dp数组以及下标名义
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
2. 递归公式
dp[i] =dp[i-1]+dp[i-2]
3. dp数组如何初始化
dp[0]=1;dp[1]=1
4. 遍历顺序(背包问题先遍历背包还是物品)
从前向后遍历
5. 打印dp数组:debug
6.代码
class Solution {
public:
int fib(int n) {
if( n == 0 )return 0;
if( n == 1 )return 1;
vector<int>dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
70. 爬楼梯
1. dp数组以及下标名义
爬到第i层楼梯,有dp[i]种方法
1楼:1种方法
2楼:两种方法
3楼:1+2种,三楼可以从二楼爬一层到达,也可以从一楼爬两层到达,只于前两层楼梯有关
2. 递归公式
dp[i] =dp[i-1]+dp[i-2]
3. dp数组如何初始化
dp[1]=1;dp[2]=2
4. 遍历顺序
从前到后
5. 代码:与斐波那契数列一样
class Solution {
public:
int climbStairs(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
if(n == 2)return 2;
vector<int>dp(n + 1);
dp[1] = 1;
dp[2] = 2;
for( int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
746. 使用最小花费爬楼梯
在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯
1. dp数组以及下标名义
dp[i]的定义为:到达第i层花费的最小值是dp[i]
2. 递归公式
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]
dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]
所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
3. dp数组如何初始化
dp[1]=cost[0];dp[0]=0;
4. 遍历顺序(背包问题先遍历背包还是物品)
从前向后遍历
5. 打印dp数组:debug
6.代码
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
if(cost.size() <= 1)return 0;
vector<int>dp(cost.size() + 1);
dp[1] = 0; dp[0] = 0;//第一步不费钱
for(int i = 2; i <= cost.size() ; i++) {
dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);
}
return dp[cost.size()] ;
}
};