【动态规划】746.使用最小花费爬楼梯

286 阅读2分钟

题目

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬
一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 01 的元素作为初始阶梯。

示例

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

主要思路

1. 创建一个数组dp,其中dp[i]表示爬到第i个阶梯的最低花费
2. 爬到第i个阶梯可以选择爬一个阶梯或者爬两个阶梯
3. 当选择爬一个阶梯时,就是从第i-1个阶梯向上爬,需要花费dp[i-1]体力值
4. 当选择爬两个阶梯时,就是从第i-2个阶梯向上爬,需要花费dp[i-2]体力值
5. 因为题目要求的是最小花费,所以需要选择dp[i-1]和dp[i-2]中的最小值
6. 最后爬到第i个阶梯还需要花费对应的体力值cost[i]
7. 递推公式为:dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i]
8. 数组初始化:dp[0] = cost[0] ,dp[1] = cost[1]
9. 数组遍历顺序为从前向后遍历

代码实现

    public int minCostClimbingStairs(int[] cost) {
        if(cost == null || cost.length == 0){
            return 0;
        }
        if(cost.length == 1){
            return cost[0];
        }
        int len = cost.length;
        int[] dp = new int[len];
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i < len; i ++){
            dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i];
        }
        return Math.min(dp[len-1],dp[len-2]);
    }

参考

代码随想录