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

题目描述

给你一个整数数组 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 。

思路分析

通过对题目进行分析我们可以发现,当前的消费都由它下面的消费所决定,我们可以把这个理解为状态
比如第n层的消费,可能会由它之前的两个决定,可能是倒数前一个,或是倒数第二个所决定。
所以就可以推导出dp[i] = Math.min(dp[i-1] + dp[i-2]) + cost[i]

代码示例

/**
 * @param {number[]} cost
 * @return {number}
 */

// 方法一:
// var minCostClimbingStairs = function(cost) {  
//     let len = cost.length;
//     let arr = [];
//     arr[0] = cost[0];
//     arr[1] = cost[1];
//     for(let i = 2; i < len; i++) {
//         arr[i] = Math.min(arr[i-1] , arr[i-2]) + cost[i]
//     }
//     return Math.min(arr[len-1], arr[len-2]);
// };

// 方法二:
var minCostClimbingStairs = function(cost) {
    let len = cost.length
   let dp1 =cost[0],
    dp2 =cost[1]
    for(let i = 2;i<cost.length;i++) {
        let dpTmp= Math.min(dp1,dp2) + cost[i]
        dp1  = dp2
        dp2 = dpTmp
    }
    return Math.min(dp1,dp2)
};
posted @ 2022-10-29 11:26  含若飞  阅读(26)  评论(0编辑  收藏  举报