746. 使用最小花费爬楼梯(javascript)746. Min Cost Climbing Stairs
数组的每个下标作为一个阶梯,第 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 。
假设数组const长度为len,则len个阶梯分别对应下标0到len-1,问题等价与计算达到下标len的最小花费,可以通过动态规划来求解:
- 创建长度为len+1的数组pd,其中pd[i]表示达到下标i的最小花费。
- 由于可以选择下标0或下标1作为初始阶梯,由此pd[0]=pd[1]=0
- 当2≤i≤n 时,可以从下标i-1使用cost[i-1]的花费达到下标i,或者从下标i-2使用cost[i-2]的花费到达下标i,为了使总花费最少,pd[i]应取上述两项的最小值,因此状态转移方式如下
pd[i]=Math.min(cost[i-1]+pd[i-1],cost[i-2]+pd[i-2])
var minCostClimbingStairs = function(cost) {
let len=cost.length
let pd=[]
pd[0]=pd[1]=0
for(let i=2;i<=len;i++){
pd[i]=Math.min(cost[i-1]+pd[i-1],cost[i-2]+pd[i-2])
}
return pd[len]
};