【学会动态规划】使用最小花费爬楼梯(3)

简介: 【学会动态规划】使用最小花费爬楼梯(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& cost) {
        int size = cost.size();
        // 创建dp表,这样初始化默认填充的是 0 
        vector 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];
    }
};


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果感到有所收获的话可以给博主点一个赞哦。


如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~


相关文章
|
6月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
6月前
leetcode746使用最小花费爬楼梯刷题打卡
leetcode746使用最小花费爬楼梯刷题打卡
38 0
|
6月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
|
5月前
【题解】NowCoder DP4 最小花费爬楼梯
【题解】NowCoder DP4 最小花费爬楼梯
33 5
03_使用最小花费爬楼梯
03_使用最小花费爬楼梯
|
6月前
leetcode代码记录(使用最小花费爬楼梯
leetcode代码记录(使用最小花费爬楼梯
35 0
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
|
6月前
动态规划之使用最小花费爬楼梯【LeetCode】
动态规划之使用最小花费爬楼梯【LeetCode】
|
6月前
代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗
代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗
48 0
|
6月前
|
Java 索引
leetcode-746:使用最小花费爬楼梯
leetcode-746:使用最小花费爬楼梯
42 0