【题目描述】

给你一个整数数组 ​​cost​​​ ,其中 ​​cost[i]​​​ 是从楼梯第 ​​i​​ 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 ​​0​​​ 或下标为 ​​1​​ 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。


【示例】

【LeeCode】746. 使用最小花费爬楼梯_数组


【代码】

思路:​动态规划​

【LeeCode】746. 使用最小花费爬楼梯_数组_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
}
}