力扣原题链接:746. 使用最小花费爬楼梯
原题描述:
分析
这个题虽然标注的是简单题,但是却用到了动态规划
的思想。
假设现在一共100级台阶,我想到达顶部的花费最小,那么只有两种方式实现:
- 第一种,从100层到顶部,那么需要知道达到100层的最低消费,加上100层自身的费用,向上爬1级,就可以到顶部。
- 第二种,从99层到顶部,那么需要知道到达99层的最低消费,加上99层自身的费用,向上爬2级就可以到顶部。
所以依次往后推,想知道达到100层的最低消费就要看98层和99层的最低消费,得出方程为:
arr[i] = arr[i - 2] + cost[i - 2]; //上两级达到当前级的消费
arr[i] = arr[i - 1] + cost[i - 1]; //上一级达到当前级的消费
//在两个消费中求最小值即可
由题干可知,我们可以选择第一层或者第二层作为起始台阶,所以到达前两层消费都是0,如果我们想到第三层,则判断到达第一层的最低消费加上第一层的费用和到达第二层的最低消费加上第二层的费用,两者求最小值就是到达第三层的最低消费。
代码
public int minCostClimbingStairs(int[] cost) {
//数组最后一位就是顶部
int[] arr = new int[cost.length + 1];
//到达前两层花费都是0
arr[0] = 0;
arr[1] = 0;
//从第三层开始计算,求到达该层的最低消费
for (int i = 2; i < arr.length; i++) {
//到达该层的最低消费+该楼层本身的费用,两者取最小值
arr[i] = Math.min(arr[i - 2] + cost[i - 2], arr[i - 1] + cost[i - 1]);
}
//返回顶部的最低消费
return arr[arr.length - 1];
}