Day37 || 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯
动态规划五步:(来自“代码随想录”)
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
509. 斐波那契数
题目链接:
力扣题目链接
思路:当前dp就是每个n的对于n-1、n-2的值;递推就是 dp[i] = dp[i-1]+dp[i-2];初始化0和1即可,顺序就是哦从前向后即可。
70. 爬楼梯
题目链接:
力扣题目链接
思路:初始化dp[1] = 1,dp[2] = 2;
递推就是 dp[i] = dp[i-1]+dp[i-2];和斐波那契数列一样。
746. 使用最小花费爬楼梯
题目链接:
力扣题目链接
思路:当前dp每个值是到当前位置最小的花费;递推就是 dp[i]=cost[i]+Math.min(dp[i-1],dp[i-2]);初始化0和1即可,最后返回值是计算n和n-1的最小值,毕竟可以跳两步,所以倒数第二个台阶也是返回值的一部分。(这个是到达位置就会花费)
//到达就会花费
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length] ;
dp[0]=cost[0];
dp[1]=cost[1];
for(int i=2;i<cost.length;i++){
dp[i]=cost[i]+Math.min(dp[i-1],dp[i-2]);
}
return Math.min(dp[cost.length-1],dp[cost.length-2]);
}
}
//跳跃才会花费
class Solution {
public int minCostClimbingStairs(int[] cost) {
int[] dp = new int[cost.length+1] ;
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]);
}
return dp[cost.length];
}
}
以上两个都可以实现目标。
时间:1.5h