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

63 阅读1分钟

题目内容

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

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

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

示例

输入: 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 。

解题思路

  • 设cost长度设为n,其中0到n-1为各个阶梯
  • 用n表示楼梯顶部
  • 建立一个长度为n+1的数组dp,dp[i]表示到达下标i的最少花费
  • 由于可以选择下标为 0 或 1 作为初始阶梯,因此dp[0] = dp[1] = 0
  • 当2<=i <= n时,dp[i]的最小值取决于dp[i-1]+cost[i-1]和dp[i-2]+cost[i-2]的较小者
  • 所以,dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

代码实现

var minCostClimbingStairs = function(cost) {
    var n = cost.length
    var dp = new Array(n+1)
    dp[0] = dp[1] = 0
    for(var i = 2; i < dp.length; i ++) {
        dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
    }
    return dp[n];
};

标签

动态规划