目录
动态规划怎么学?
1. 题目解析
2. 算法原理
1. 状态表示
2. 状态转移方程
3. 初始化
4. 填表顺序
5. 返回值
3. 代码编写
写在最后:
动态规划怎么学?
学习一个算法没有捷径,更何况是学习动态规划,
跟我一起刷动态规划算法题,一起学会动态规划!
1. 题目解析
题目链接:746. 使用最小花费爬楼梯 - 力扣(Leetcode)
老规矩,我们先来分析一下题目,
题目要求计算返回到达楼顶的最低费用,我们先来看看第一个示例,
可以看到他返回的是15,证明15能一步走到楼顶而10不能,
我们由此可以推出,楼顶是超出数组的后一个位置,
知道了这个,题意就基本上理解了。
2. 算法原理
1. 状态表示
根据之前的学习我们已经知道该怎么分析状态表示了,
就是 dp[ i ] 位置表示什么,或者说怎么表示 dp [ i ],根据题目要求,
dp[ i ] 就是到达 i 位置的最小花费。
2. 状态转移方程
推导状态转移方程的技巧其实就是,用之前或者之后的状态,推导出 dp[ i ] 的值。
根据最近的一步划分问题,就好像这道题目,
而最近的一步有两种情况,
1. 从 dp[ i - 1 ] 走一步过来,支付cost[ i - 1 ] 的费用;
2. 从 dp[ i - 2 ] 走两步过来,支付cost[ i - 2 ] 的费用。
而 dp[ i ] 就是到达 i 位置的最小花费,
那我们就能得出状态转移方程:
dp [ i ] = min( dp[ i - 1 ] + cost[ i - 1 ],dp[ i - 2 ] + cost[ i - 2 ] )
3. 初始化
初始化时为了填表的时候不越界。
所以我们需要初始化的就是 dp[ 0 ] 和 dp[ 1 ]。
dp[ 0 ] = dp[ 1 ] = 0。
4. 填表顺序
填表顺序这次还是从左往右。
5. 返回值
因为我们需要到达楼顶,也就是数组后一个位置,所以应该返回的是 dp[ n ]。
3. 代码编写
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int size = cost.size();
// 创建dp表,这样初始化默认填充的是 0
vector<int> dp(size + 1);
// 填表
for(int i = 2; i <= size; i++) {
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
// 返回结果
return dp[size];
}
};
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~