文档链接:https://programmercarl.com/
LeetCode509.斐波那契数
题目链接:https://leetcode.cn/problems/fibonacci-number/
思路:
动规五部曲:
这里我们要用一个一维dp数组来保存递归的结果
1.确定dp数组以及下标的含义
dp[i]的定义为:第i个数的斐波那契数值是dp[i]
2.确定递推公式
为什么这是一道非常简单的入门题目呢?
因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];
3.dp数组如何初始化
4.确定遍历顺序
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的
5.举例推导dp数组
按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:
0 1 1 2 3 5 8 13 21 34 55
如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。
动态规划:
class Solution {
public:int fib(int n) {if(n <= 1) return n;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];}
};
LeetCode70.爬楼梯
题目链接:https://leetcode.cn/problems/climbing-stairs/
思路:一步一步推到得出递推公式就好写很多。跟斐波那契数一样的。
动态规划:
class Solution {
public:int climbStairs(int n) {if(n <= 2) return n;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];}
};
LeetCode746.使用最小花费爬楼梯
题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/
思路:明确dp[i]表示的意义:到达第i阶所需的最小花费。楼顶不是cost.size() - 1而是cost.size()。
动态规划:
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {vector<int> dp(cost.size() + 1);dp[0] = 0;dp[1] = 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()];}
};
总结:为了备战蓝桥杯,跳着先刷动态规划了。贪心后面再补。