一个楼梯,第i阶都有一个非负的花费cost[i],从0开始索引。java
一旦你支付了花销,你就能够跳上一阶或者两阶。你须要找到到达楼梯顶的最小花费,你能够选择从楼梯第0阶或者第1阶开始。数组
例子1spa
输入: cost = [10, 15, 20]code
输出: 15blog
解释: 最小花费是从第1阶开始,支付15跳上两阶就到达楼梯顶。索引
例子2io
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]class
输出: 6方法
解释: 最小花费是从第0阶开始,跳的阶梯顺序为0,2,4,6,7,9,顶部,花费为6。im
注意
cost数组长度在[2, 1000]
cost数组中的元素大小范围[0, 999]
这道题目相似于爬楼梯问题,只不过加上了花销,是一个典型的动态规划问题。
这个题目说能够从第0阶开始,也能够从第1阶开始,咱们先只考虑一种状况,即只从第0阶开始。那么假设dp[i]表示跳到第i阶所需的最小花费,那么能够获得递推式dp[i] = min(dp[i-1] + cost[i - 1], dp[i-2] + cost[i-2])。
最后返回dp[cost.length],即跳到楼梯顶(第cost.length阶)的最小花费。接下来再考虑从第一阶开始的状况,咱们能够把第1阶当作第0阶,而后继续使用前面的方法,最后返回这两个dp[cost.length]的最小值。
class Solution { public int minCostClimbingStairs(int[] cost) { int a = 0,b=0,temp=0; //TODO 为何长度要+1了,你知道么? int length = cost.length+1; for (int i = 2; i < length;i++){ temp = Math.min(a+cost[i-2],b+cost[i-1]); a = b; b = temp; } return temp; } }
疑问:
例子1
输入: cost = [10, 15, 20]
输出: 15
疑问:直观感觉,是否是应该从10直接跳转到20,输出应该是10?
例子2
输入:[0,0,1,1]
输出:1
疑问:直观感觉,是否是应该从第二个0(索引是1)直接跳转到最后一个1(索引是3),输出应该是0?
瞅瞅,题意说的最终目的是达到终点位置,而不是站在最后一个索引位置(20所在位置)。
因此,若是咱们要到达终点,须要从cost[1](值是15) 开始,跨2个阶梯,直接达到终点。所耗费的钱是15.
若是从索引cost[0](值是10)开始,则须要通过cost[0],cost[0]才能到达终点,所耗费的钱是 25.
同理,代码中 长度为何要+1
//TODO 为何长度要+1了,你知道么? int length = cost.length+1;
其实是为了计算到达终点的位置所耗费的金钱。所以length须要+1