代码随想录算法训练营第32天 | 动态规划基础理论、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
一、动态规划基础理论
动态规划五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
二、509. 斐波那契数
class Solution {
public int fib(int n) {
if(n<=1) return n;
int[] dp = new int[2];
dp[0] = 0;
dp[1] = 1;
for(int i=2 ; i<=n ;i++){
int dpi=dp[0]+dp[1];
dp[0]=dp[1];
dp[1]=dpi;
}
return dp[1];
}
}
二、70. 爬楼梯
class Solution {
public int climbStairs(int n) {
if(n<=2) return n;
int[] dp = new int[3];
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i<=n ; i++){
int dpi = dp[1] + dp[2];
dp[1] = dp[2];
dp[2] = dpi;
}
return dp[2];
}
}
三、746. 使用最小花费爬楼梯
从0或1处开始,说明走到0或1的花费都是0,后面每一步 是前两个位置的(历史花费加上迈出这一个台阶的花费)的最小值。
class Solution {
public int minCostClimbingStairs(int[] cost) {
int dp0 = 0;
int dp1 = 0;
for(int i = 2 ; i<=cost.length ; i++){
int dpi = Math.min(dp0+cost[i-2],dp1+cost[i-1]);
dp0 = dp1;
dp1 = dpi;
}
return dp1;
}
}