极客前端实战第0期对标阿里P6
给你一个整数数组成本,其中cost是爬第I级楼梯需要支付的成本。一旦你付了这个费用,你可以选择爬上一两个台阶。
可以选择从下标0或下标1的台阶上楼梯。
请计算并返回到达楼梯顶部的最低成本。
示例1:
输入:成本= [10,15,20]
产量:15
说明:您将从下标为1的步骤开始。
付15英镑,爬两级台阶到楼梯顶。
总费用是15英镑。
对书名或背景的注释
像爬楼梯一样爬楼梯。我们必须进行第三步。那么,我们如何进行第三步呢?有两种选择:从第二步开始走1步,或者从第一步开始走2步。
那么问题的关键就在于,在两个选择中:有几种方法可以到达第二步,也有几种方法可以到达第一步。找到两个选择的和就是到达第三步的方法的数量:
//递归公式
DP[I]= DP[I-1]+DP[I-2];
爬楼梯的最小成本继续假设我们跨过第2级台阶。什么是跨越2步,就是上2步,交了2步的继续上楼费(加上成本[2])就是跨越2步。
//初始条件
DP[0]= cost[0];也就是跨越阶梯的最小成本0。
dp[1] =成本[1];也就是跨越第一步的最小成本。
因此,dp阵列的每个位置记录了穿过当前位置的最低成本。
然后,让我们回到假设。如何才能在跨过第2个阶梯之前,也就是在加上成本之前,得到所需的费用[2]?换句话说,我如何进行第二步?如果我知道如何到达第二步,那么它将花费我最少的代价,这是我到达第二步之前的最小代价,即Math.min(dp[i-1],dp[i-2]),加上cost[2]就是穿越第二步的最小值。
所以,用动态编程来解决问题:
var minCostClimbingStairs = function(cost){
设len = cost.length
设arr =[];
arr[0]= cost[0];
arr[1]= cost[1];
for(设I = 2;i < leni++) {
arr = Math.min(arr[i-1],arr[i-2]) + cost
}
return Math.min(arr[len-1],arr[len-2]);
};
极客前端实战第0期对标阿里P6
download链接:https://pan.baidu.com/s/1X84NeAwyHS3Rwry2Aj4rkQ?pwd=7f1o 
提取码:7f1o 
--来自百度网盘超级会员V5的分享