代码随想录Day38 |509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
动态规划
文档讲解:代码随想录
视频讲解:
状态
五步:
dp数组和下标的确定
递推公式
dp数组初始化
遍历顺序
打印dp数组
509.斐波那契数
文档讲解:代码随想录
视频讲解: 手把手带你入门动态规划 | leetcode:509.斐波那契数
状态
根据斐波那契数列特性来构建dp数组
- dp数组以及下标
dp数组就是存储斐波那契数列的每个元素值,dp[i]表示的是第i个数的斐波那契数列值 - 递推公式
dp[i]=dp[i-1]+dp[i-2] - dp数组的初始化
斐波那契数列的初始值 0和1j
dp[0] = 0 dp[1] = 1 - 遍历顺序
通过观测dp[i]是怎样得到的得出遍历顺序,对于斐波那契数列是从前往后。 - 打印dp数组
用来判断我们的数列和递推公式的正确性
class Solution {
public:
int fib(int n) {
//当 n 不超过1 需要直接返回
if(n <= 1) return n;
//dp 数组
vector<int> dp(n+1);
//dp数组的初始化
dp[0] = 0;
dp[1] = 1;
//遍历
for(int i=2;i<n+1;i++)
{
//递推公式
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
};
70.爬楼梯
文档讲解:代码随想录
视频讲解: 带你学透动态规划-爬楼梯|LeetCode:70.爬楼梯
状态
- dp数组
dp[i] 表示爬i阶的方法数 - 递推公式
第i阶可以表示为从i-1阶攀爬1阶,或者i-2阶攀爬2阶
dp[i] = dp[i-1]+dp[i-2] - 数组初始化
dp[1] = 1 dp[2] = 2 - 遍历顺序
从前往后 - 打印dp数组
1 , 2, 3, 5
class Solution {
public:
int climbStairs(int n) {
if(n <= 1) return n;
vector<int> dp(n+1);
//初始化
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i<n+1;i++)
{
dp[i] = dp[i-1]+dp[i-2];
}
return dp[n];
}
};
746.使用最小花费爬楼梯
文档讲解:代码随想录
视频讲解: 动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯
状态
本题需要注意的是,爬到楼梯顶部,即需要越过最后一个数,即到达不存在的下标为n的位置。
- dp数组
dp[i] 表示 到达第i个台阶的最低花费 - 递推公式
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
- 初始化
dp[0] = 0;
dp[1] = 0; - 遍历顺序
从前向后 - 打印dp数组
dp[2] = min(dp[0]+cost[0],dp[1]
+cost[1]) = 10
//存在一个n = 3
dp[3] = min(dp[1]+cost[1],dp[2]
+cost[2]) = 15
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<dp.size();i++)
{
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[cost.size()];
}
};