力扣 746 使用最小花费爬楼梯

力扣 746 使用最小花费爬楼梯

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:746. 使用最小花费爬楼梯

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

示例 1:

输入:cost = [10, 15, 20]
输出:15
解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。

示例 2:

输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。

考查知识点

动态规划


自己的第一遍解法

一开始看到题目给定数组cost,又想到dp数组,还有点懵,但是按照【动规五步法】来分析,就很容易理清思路了。

1、确定dp数组(dp table)以及下标的含义

要确定dp数组的含义,可以直接看题目要求的是什么,题目要求返回爬到顶层的最少体力耗费,那么dp[n]就代表爬上第n阶台阶所耗费的体力。然而,这里有一个问题,就是**dp[n]里面有没有第n阶台阶的体力呢?**我自己做的时候是包含的,这样的dp[n]其实是从第n阶台阶上出发时耗费的最少体力。

2、确定递推公式

动态规划的要义就在于当前状态与前一状态有关。那么根据题意,要想从第n阶台阶上出发,上一步必须在{n-1, n-2}两个台阶其中之一上,那么dp[n]中既包括当前台阶所消耗的体力cost[n],还要包括上一次跨越台阶消耗的体力min{ dp[n-1], dp[n-2] }

根据上面的分析,递推公式就是dp[n] = min{ dp[n-1], dp[n-2] } + cost[n]

3、dp数组如何初始化

首先就是dp[0]一定就是从第0阶台阶出发,dp[0] = cost[0]

dp[1]有三种情况,从0阶出发走一步到1阶,直接从1阶出发,就是dp[1] = min(cost[1], cost[0] + cost[1]),其实在仔细看看,既然都是要从1阶直接出发,肯定是直接选择从1阶开始耗费最少,可以改成dp[1] = cost[1]

4、确定遍历顺序

分析问题是从上到下,解决问题时从下到上,先算小的台阶,再来算大台阶

5、举例推导dp数组

cost=[1, 100, 1, 1, 1]
index 0   1   2  3  4
dp[]  1   100 2  3  3

全部代码如下:

class Solution {
    
    
public:
    int minCostClimbingStairs(vector<int>& cost) {
    
    
        if (cost.empty())   return 0;
        if (cost.size() == 1)   return cost[0];
        if (cost.size() == 2)   return min(cost[0], cost[1]);

        int n = cost.size();
        vector<int> dp(n);  //从第n个台阶出发耗费的体力,包含历史耗费体力和当前耗费体力
        dp[0] = cost[0];
        dp[1] = min(cost[1], cost[0] + cost[1]);//这里迷糊了,肯定是cost[1]最小
        for (int i = 2; i < n; ++i) {
    
    
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
        }

        return min(dp[n-1], dp[n-2]);
    }
};

int main() {
    
    
    Solution so;
    vector<int> cost = {
    
    1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    cout << so.minCostClimbingStairs(cost) ;
}

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/114000418