题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
解法一:
- 状态表示:dp[i]表示:到达i位置时,最小花费(以i位置为结尾,巴拉巴拉)
- 状态转移方程:用之前的状态推导出dp[i]的值 -> dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
解法二:
- 状态表示:dp[i]表示:从i位置出发,到达楼顶,最小花费(以i位置为起点,巴拉巴拉)
- 状态转移方程:用之后的状态推导出dp[i]的值 -> dp[i] = Math.min(cost[i]+dp[i+1],cost[i]+dp[i+2])
代码:
class Solution {
//方法一:dp[i]表示:到达i位置时,最小花费
public int minCostClimbingStairs1(int[] cost) {
//2.创建数组
int[] dp = new int[cost.length+1];
//3.赋初值
dp[0] = 0;
dp[1] = Math.min(dp[0]+cost[0],0);
//4.填表
for(int i=2;i<=cost.length;i++){
int a = dp[i-2]+cost[i-2];
int b = dp[i-1]+cost[i-1];
dp[i] = Math.min(a,b);
}
//5.返回值
return dp[cost.length];
}
//方法二:dp[i]表示:从i位置出发,到达楼顶,最小花费
public int minCostClimbingStairs(int[] cost) {
//2.创建数组
int[] dp = new int[cost.length];
//3.赋初值
dp[cost.length-1] = cost[cost.length-1];
dp[cost.length-2] = cost[cost.length-2];
//4.填表
for(int i=cost.length-3;i>=0;i--){
dp[i] = Math.min(cost[i]+dp[i+1],cost[i]+dp[i+2]);
}
//5.返回值
return Math.min(dp[0],dp[1]);
}
}