// 方式一:第一步不支付费用
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
int[] dp = new int[len + 1];
// 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0
dp[0] = 0;
dp[1] = 0;
// 计算到达每一层台阶的最小费用
for (int i = 2; i <= len; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[len];
}
}
终于看懂题目了。题目给出的只是台阶,不包括水平线和天台。虽然索引从0开始,但0算是第一个台阶。
第一个例子【10,15,20】。
体力值 10 15 20
水平线 0 1 2 天台
一次最多可以跨两步。cost[i]为离开当前台阶需要的体力,水平线出发不花体力。
如果离开水平线跨1步到了0级,耗费体力为0;然后离开0级跨一步或两步都是10体力,如果跨到2级,这时还没到天台,还要跨一步离开2级要20体力。所以共需要30体力。
如果一开始跨2步直接到1级,花费0体力,然后离开1级跨两步直接上天台,花费15体力。所以共需要15体力
参考博客:
Leetcode吃拌面想喝汤
746.使用最小花费爬楼梯代码随想录