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

贾蔷
• 阅读 97

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

题目解析:

站在楼梯的某个台阶时,需要支付当前台阶对应的体力值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循环内的条件语句增加了代码复杂度。

代码+注释:

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()]; // 返回到达顶部的最小花费
    }
};

原文https://www.xinaozhilu.cn/list/15.html

点赞
收藏
评论区
推荐文章
似梦清欢 似梦清欢
2年前
排序算法(简单选择、堆排序、归并)
简单选择排序:::tip简单选择排序原理:将未排序的数组中从前向后遍历,找到最小的元素和数组中第一个元素交换位置,此时数组中第一个元素位置已经确定,再将未排序的数组中从前向后遍历,找到最小的元素和数组中第二个元素交换位置,依次向下。:::需要两层循环,外层
桃浪十七丶 桃浪十七丶
4年前
C++写一个简单排序算法
分析算法步骤:1、暂定元素排列第0个为最小值,下标为min;2、然后从左往右依次扫描,与min的关键字比较,若比min的更小,则更新min下标为当前下标;3、并且把先前的最小值与当前找到目标的元素交换位置。cinclude<iostreamusingnamespacestd;voidSwap(int&a,int&b)inttem
Stella981 Stella981
3年前
Python常用算法(一)
1.选择排序不断找到最小的(找最大的也是可以的)首先拿到第一个,然后发现比它小的,记住下标。循环一轮,找到最小的数的位置和最左边的数交换位置然后从第二个开始....和第二个交换位置,循环最后变得有序codingutf8defselect_sort(list):foriin
Wesley13 Wesley13
3年前
Unity 2D 效应器与来回移动的实现
1.效应器PointEffector2D:点效应器。进入区域,吸引或排斥物体AreaEffector2D:区域效应器,可以用来做马里奥的管道移动效果SurfaceEffector2D:表面效应器。实现传送带效果PlatFormEffector2D:平台效应器。实现2D游戏里面的台阶效果2.控制移动//U
Wesley13 Wesley13
3年前
Java面试总结(排序算法)
1.冒泡排序算法描述:两两比较,大的放后面2.选择排序算法描述:在m元数组中找到最小值的位置,然后将最小值的位置和第n(n0,1,2,....m1)位的值对调,排序k次则m元数组中前k(k<m)位的值已经排序好,m元数组中前k位的值不需要再进行排序,此时需要排序的元素只有mk个3.插入排序算
Stella981 Stella981
3年前
LeetCode:283.移动零——简单
题目:283.移动零:给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入:0,1,0,3,12输出:1,3,12,0,0说明:1.必须在原数组上操作,不能拷贝额外的数组。2.尽量减少操作
Wesley13 Wesley13
3年前
Java排序算法之选择排序
1\.基本思想选择排序(selectsorting)的基本思想是:1)对于一个大小为n的数组,选择排序共执行n1轮排序2)每轮排序寻找到该轮最小的数放到开始位置上:先假定当前这个数是最小数然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,得到下标当遍历到数组的最
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
数字先锋 | 央企首批!天翼云助力中国石化率先完成全尺寸DeepSeek国产化部署!
人工智能大模型发展如火如荼,以智能化推进传统产业升级已经成为发展新质生产力的重要引擎。作为云服务国家队,天翼云将持续夯实国云智算底座,探索更多算力与AI的融合模式,赋能央国企深化改革,打造人工智能产业创新高地,助推我国数字经济发展再上新台阶。
贾蔷 贾蔷
6天前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们