题目
数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
示例 1:
输入: cost = [10, 15, 20]
输出: 15
解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。
示例 2:
输入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出: 6
解释: 最低花费方式是从cost[0]开始,逐个经过那些1,跳过cost[3],一共花费6。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 分析
这是一道典型的动态规划题目。
按照解决DP问题的三部曲。
- 定义
dp[i],表示爬(i+1)阶台阶需要的花费 - base case
dp[0]=0
dp[1]=min{cost[0],cost[1]} - 转移方程
要想爬到n阶,有两种方式:
(1):在dp[n-1],------>dp[n-1]+cost[n]
(2):在dp[n-2],------->dp[n-2]+cost[n-1]
dp[n]=min{dp[n-1]+cost[n],dp[n-2]+cost[n-1]}
public int minCostClimbingStairs(int[] cost) {
//1.definition
int[] dp=new int[cost.length+1];
//2.base case
dp[0]=0;
dp[1]=Math.min(cost[0],cost[1]);
for(int i=2;i<cost.length;i++){
//3.transfer
// n阶可以有两种走法:a>:走到n-1阶,然后直接走两步
// b>:都到n-2阶,然后走一步在走一步,或者直接走两步
dp[i]=Math.min(dp[i-1]+cost[i],dp[i-2]+cost[i-1]);
}
return dp[cost.length-1];
}