给你一个整数数组 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 。
提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999
分析:
我们可以选择上两层台阶或一层台阶,但是要求花费金额最少,dp题一般都是从2下标还是,因为需要用到前两个下标的值进行一些逻辑处理,我们先创建一个数组去存0和1索引的值,从2索引开始遍历,先找出前两个索引的最小值,加上我们当前索引的费用用来记录当前的花费金额,然后我们需要比较花费金额的大小,找到最小花费金额即我们需要的答案。
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] f = new int[cost.length+10];
f[0] = cost[0];
f[1] = cost[1];
for(int i = 2;i < cost.length;i++){
f[i] = Math.min(f[i-1],f[i-2])+cost[i];
}
return Math.min(f[cost.length-1],f[cost.length-2]);
}
}