当前位置:首页 > 力扣 > 力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

2个月前 (05-16)

力扣746:三步通关最小花费爬楼梯 动态规划 算法 力扣 C++ 第1张

题目解析:

站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点。要求找出到达顶部的‌最小花费路径‌。例如输入cost=[10,15,20]时,最佳路径是从索引1出发直接跨两步到顶部,总花费15。


解题思路与过程:

1.关键逻辑拆解

    ‌状态定义‌:dp[i]表示到达索引i台阶时的最小累计花费。

‌    初始化设定‌:

        dp[0]=cost[0](必须支付cost[0]才能站在第0级)

        dp[1]=cost[1](同理必须支付cost[1]才能站在第1级)

        dp[2]=min(dp[0],dp[1])(到达索引2时可选前两步中更优路径)

2‌.循环递推‌:

    从i=3开始遍历到cost.size()(即楼梯顶部)

    ‌特殊处理i=3‌:当i-1 == 2时,说明当前处于索引3,此时比较前一步总花费+cost[i-1]与前两步总花费的最小值

    ‌一般情况‌:其他位置比较前一步总花费+cost[i-1]与前两步总花费+cost[i-2]


算法特点

‌1.反向递推终点‌:最终返回dp[cost.size()],该位置代表楼梯外的顶部,其值由前面的递推关系决定。

‌2.边界条件优化‌:通过提前处理dp[2]减少后续分支判断,但for循环内的条件语句增加了代码复杂度。


代码+注释:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int dp[1001]; // 假设cost长度<=1000,避免动态内存分配
        dp[0] = cost[0]; // 必须支付cost[0]才能站在第0级台阶
        dp[1] = cost[1]; // 同理,支付cost[1]后才能站在第1级
        dp[2] = min(dp[0], dp[1]); // 到达第2级的最小花费为前两步的较小值
        
        for(int i = 3; i <= cost.size(); i++) { // 从第3级开始推导到顶部
            if(i-1 != 2) { // 非特殊位置时的通用递推
                dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
            } else { // 处理i=3时的特殊边界情况
                dp[i] = min(dp[i-1] + cost[i-1], dp[i-2]);
            }
        }
        return dp[cost.size()]; // 返回到达顶部的最小花费
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

力扣第1984题精解:如何通过排序将时间复杂度优化到O(n log n)?

题目解读给定一个整数数组和一个整数 k,需要找到所有大小为 k 的子数组中最大值与最小值的差值的最小值。例如,数组 [9,4,1,7] 中若 ...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。