理论基础
动态规划五部曲(类似递归三部曲):
- 确定DP数组和其下标含义
- 确定递归公式
- DP数组如何初始化
- 确定遍历顺序
- 举例推到DP数组
动态规划其实也是一种穷举法,但是它将之前的结果保存了,用空间换取了时间。
LC 509. 斐波那契数
题目链接:LC 509. 斐波那契数
思路:按着给的公式写就行
代码:
class Solution {
public:
int fib(int n) {
vector<int> nums;
nums.push_back(0);
nums.push_back(1);
if(n<=1){
return nums[n];
}
for(int i=2; i<=n; i++){
nums.push_back(nums[i-1]+nums[i-2]);
}
return nums.back();
}
};
LC 70. 爬楼梯
题目链接:LC 70. 爬楼梯
思路:从1开始一步一步模拟发现有规律可循。
代码:
class Solution {
public:
//走到1,有1中走法;走到2,有两种走法;走到3可以从1或者2开始走,有1+2 = 3种走法,因为从2开始的包括1+1+1了,所以从1开始到3的只有1+2一种;同样到4有3+2=5种走法
int climbStairs(int n) {
vector<int> nums(n);
if(n<=3){
return n;
}
nums[0] = 1;
nums[1] = 2;
for(int i=2; i<n; i++){
nums[i] = nums[i-1]+nums[i-2];
}
return nums[n-1];
}
};
LC 746. 使用最小花费爬楼梯
题目链接:LC 746. 使用最小花费爬楼梯
思路:有一点点的贪心,然后再加上动态规划,到0或1位置时无需花费体力,但是到2时要花费从0到2或者从1到2的体力,两者进行比较取小值;往后是依次累加的。
代码:
class Solution {
public:
//两步以内看谁花费少就走哪里,但是注意第一步不管走一阶还是两阶花费都是0
//dp[i] = dp[i-1]+cost[i-1]
//dp[i] = dp[i-2]+cost[i-2]
//上面是dp的更新公式,哪个小dp[i]就是哪个
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size());
dp[0] = 0;
dp[1] = 0;
for(int i=2; i<dp.size(); i++){
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return min(dp[dp.size()-1]+cost[dp.size()-1],dp[dp.size()-2]+cost[dp.size()-2]);
}
};