题目描述
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费
该题是一个动态规划题,也与斐波那契数列很像。
斐波那契数列:509. 斐波那契数 - 力扣(LeetCode)
【过程】
- 我们定义一个数组dp[n + 1],用来存放爬上每个台阶所花费的力气,由题可知,我们可以从第0阶,或者第1阶出发。因此dp[0] = dp[1] = 0;
- 那么如何更新第2阶呢,第2阶可以直接从第0阶上来,也可以从第1阶上来。因为要花费力气最小,那么我们就更新 min(n-2所花费的代价,n-1所花费代价)的最小值;
- 直接返回结果return dp[n]。
package db;
import internet.c1.Array;
import java.util.Arrays;
public class MinCostClimbingStairs {
public static void main(String[] args) {
int[] cost = {10, 15, 20};
int res = new MinCostClimbingStairs().minCostClimbingStairs(cost);
System.out.println("res = " + res);
}
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length + 1];
// 题目中说,你可以选择从0 或者1开始爬。因此 dp数组初始化为0
/*dp[0] = 0;
dp[1] = 0;*/
for (int i = 2; i <= cost.length; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1],dp[i - 2] +cost[i - 2]);
}
System.out.println("dp = " + Arrays.toString(dp));
return dp[cost.length];
}
}