【题目描述】

数组的每个下标作为一个阶梯,第 ​​i​​​ 个阶梯对应着一个非负数的体力花费值 ​​cost[i]​​​(下标从 ​​0​​ 开始)。

每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。

请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

​https://leetcode.cn/problems/GzCJIP/​


【示例】

【LeeCode】剑指 Offer II 088. 爬楼梯的最少成本_数组

【代码】

思路:​动态规划​

【LeeCode】剑指 Offer II 088. 爬楼梯的最少成本_数组_02

package com.company;
import java.util.*;

// 2023-2-27
class Solution {
public int minCostClimbingStairs(int[] cost) {
int len = cost.length;
int[] dp = new int[len];

// 从下标0开始爬
dp[0] = cost[0];
// 从下标开始爬
dp[1] = cost[1];

for (int i = 2; i < len; i++){
dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
}
// System.out.println(dp[len - 1]);
return Math.min(dp[len - 1], dp[len - 2]);
}
}
public class Test {
public static void main(String[] args) {
new Solution().minCostClimbingStairs( new int[]{10,15,20}); // 输出: 15
new Solution().minCostClimbingStairs( new int[]{1,100,1,1,1,100,1,1,100,1}); // 输出: 6
}
}


【代码】

思路:​动态规划​

package com.company;
import java.util.*;

// 2023-2-28
class Solution {
public int minCostClimbingStairs(int[] cost) {
int size = cost.length;
int[] minCost = new int[size];
// 最开始从0开始
minCost[0] = 0;
// 最开始从1开始:
minCost[1] = Math.min(cost[0], cost[1]);
for (int i = 2; i < size; i++) {
minCost[i] = Math.min(minCost[i - 1] + cost[i], minCost[i - 2] + cost[i - 1]);
}
return minCost[size - 1];
}
}

public class Test {
public static void main(String[] args) {
new Solution().minCostClimbingStairs( new int[]{10,15,20}); // 输出: 15
new Solution().minCostClimbingStairs( new int[]{1,100,1,1,1,100,1,1,100,1}); // 输出: 6
}
}