509. 斐波那契数
题目链接/文章讲解/视频讲解:代码随想录
1.代码展示
//509 斐波那契数
int fib(int n) {
if (n == 0 || n == 1) {
return n;
}
//step1 定义dp数组,本题的dp[i]含义是第i个斐波那契数
vector<int> dp(n + 1);
//step2 确定递推表达式
//本题表达式未dp[i] = dp[i - 1] + dp[i -2]
//step3 根据递推表达式初始化dp数组
dp[0] = 0;
dp[1] = 1;
//step4 进行for循环遍历
for (int i = 2; i <= n; i++) {
//确定递推公式
dp[i] = dp[i - 1] + dp[i - 2];
//step5 打印dp数组
cout << dp[i] << endl;
}
return dp[n];
}
2.本题小节
思考:本题比较简单,按照动态规划五部曲来即可,递推公式也已经给了,根据题意对dp数组和dp初始值进行赋值,遍历时更具题意从i = 2 开始遍历。
基本思路:五部曲,根据递推公式可知,当n = 0,1时需要直接返回。最后的结果直接返回dp[n]即为所求
70. 爬楼梯
题目链接/文章讲解/视频讲解:代码随想录
1.代码展示
//70 爬楼梯
int climbStairs(int n) {
if (n == 1 || n == 2) {
return n;
}
//step1 定义dp数组,本题的dp[i]表示的是
//爬上第i阶有dp[i]中方法
vector<int> dp(n + 1);
//step2 定义递推公式
//dp[i] = dp[i - 1] + dp[i - 2];
//step3 初始化数组
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
//step4 进行for循环遍历
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
//step5 打印dp数组
cout << i << dp[i] << endl;
}
return dp[n];
}
2.本题小节
思考:本题的核心是要理解到达每层阶梯需要的此时是如何求得的,由于每次可以迈到一阶或者两阶阶梯,因此只考虑当前情况的话,就是达到前两阶阶梯方法之和,递归公式和上一题一样。
基本思路:和上一题基本一样,只是初始化的时候第0阶不可用,因此把第1,2阶初始化了,遍历从第三阶开始。
746. 使用最小花费爬楼梯
题目链接/文章讲解/视频讲解:代码随想录
1.代码展示
//746.使用最小花费爬楼梯
int minCostClimbingStairs(vector<int>& cost) {
//step 定义dp数组,本题的dp[i]表示
//爬到第i阶的最低花费
vector<int> dp(cost.size() + 1);
//step2 定义递推公式
//dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
//step3 初始化dp数组
dp[0] = 0;
dp[1] = 0;
//step4 进入for循环
for (int i = 2; i < dp.size(); i++) {
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
//step5 打印dp数组
cout << i << dp[i] << endl;
}
return dp[cost.size()];
}
2.本题小节
思考:本题要明白的是如何求取每层阶梯的最小花费,每层阶梯都是最小花费的话,最后到达顶点就是最小花费。由于可以从第0阶或者第1阶开始,因此在这两阶的花费为0,我们直到每一阶的花费都是从前一解或者前两阶的花费加上对应阶的花费的和来的,但是我们要选择最小的,因此有了递推公式,最后从2开始遍历。
基本思路:明确递推公式是如何来的,这题就比较好做了,思路跟着思考走