Leetcode 746. 使用最小花费爬楼梯

该文介绍了一个使用动态规划解决的算法问题,给定一个表示每个台阶成本的整数数组,目标是找到从底部到顶部的最低花费路径。路径可以选择每次爬1个或2个台阶。动态规划策略是基于前两个台阶的最小成本来计算当前台阶的成本,并不断更新最小成本直到到达顶部。
摘要由CSDN通过智能技术生成

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。
示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。
 

提示:

2 <= cost.length <= 1000
0 <= cost[i] <= 999


题解:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        if (cost.size() == 1)
        return cost[0];
        if (cost.size() <= 2)
        return cost[0] > cost[1] ? cost[1] : cost[0];
        int minconst[2] = {0, min(cost[0], cost[1])};
        int min_const = 0;
        for (int i = 2; i < cost.size(); i ++)
        {               //  第一个两步最小值           第一个一步最小值
            min_const = min(minconst[0] + cost[i - 1], minconst[1] + cost[i]);
            minconst[0] = minconst[1];
            minconst[1] = min_const;
        }
        return min_const;
    }
};

解析:
        一道经典的动态规划,因为每次只能上1或者2个台阶,所以对于选择上楼梯的最佳路线,首先寻找最小的步骤,即对于每一个最短路径可以分为多个最小的最短路径的组合,观察可得,最小的路径有两种可能

1. 对于第 i 个台阶,我们在第 i-2 个台阶处上升两个台阶,到达第 i 个台阶时再花费cost[i]上升一个台阶

2. 对于第 i 个台阶,我们在第 i-1 个台阶处上升一个台阶,到达第 i 个台阶时再花费cost[i]上升一个台阶

两种可能中取最短即可得到最短路径的一部分

为什么要这样分类?

因为我们需要组合出所有的到达 i 的可能的路径,对于到达 i 我们应当考虑已经到达 i - 1与 i - 2位置,不然就会漏算导致结果错误 

举例 :

例如测试用例只有三个数 10 15 20

对于第三个台阶 (只考虑>=2下标的台阶)我们有这样几种可能

1. 从第1个台阶出发上升2个台阶到达第3个再向上走一个

2. 从第2个台阶出发上升1个台阶到达第3个再向上走一个

为什么只有两种? 因为还有一种第一个台阶走一个第二个台阶走一个到达第三个台阶的路线必定要比上述两个要少!所以不做考虑 对于此后的每一个台阶 到达它的路径永远只有两种 i - 1 处走一步到达i 与 i - 2处走两步到达 i (为什么不说能在 i - 1处走两步? 因为我们考虑的是到达 i 不是走完!对于 i - 1 处走两步的这种可能应该在考虑如何到达 i + 1处时再去考虑!

考虑>=2下标的台阶 即 在到达第三个台阶之前我们需要的花费(因为题目可以从第一个第二个任选一个开始 所以这里会多一个初始的条件)

1. 准备从第二个台阶向上走两个台阶,因为还没有走(也可以把这种情况看成是从地面上走两个台阶到达第二个台阶)所以花费为0

2. 从第一个台阶开始向上走两个到达第三个台阶,准备走一个台阶走出第三个台阶

3. 从第二个台阶走一个台阶到达第三个台阶,准备走一个台阶走出第三个台阶

从我们分析的红字两种可能来分类 2 、3种可能为同种情况 只是因为题目可以从第一第二台阶任意选一个作为起始点而产生了例外,我们只需要选cost[0]、cost[1]中花费最少的即可

之后只需要在走上3、4.....个台阶的目标中不断更新min_const即可找到最佳路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值