重点在入门,第一题直接看的视频
动态规划五部曲:
确定dp【i】的含义
递推公式
dp数组初始化
遍历顺序
打印dp数组
509.斐波那契数
class Solution {
public int fib(int n) {
if(n == 0)return 0;
if(n == 1)return 1;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i < dp.length; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
70.爬楼梯
class Solution {
public int climbStairs(int n) {
//1.确定dp[i]的含义 就是爬到第i阶梯有多少种方法
//2.递推公式 dp[i] = dp[i-1] + dp[i-2];
//3.dp数组初始化 dp[1] = 1, dp[2] = 2 dp[0] = 0
//4.遍历顺序 从前往后
//5.打印dp数组
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
进阶版 每步可以跨1 2 3 4 5... m 步,求跨到n有多少种方法
int[] dp = new int[n+1];
dp[0] = 1;
for(int i = 0; i <= n; i++){
for(int j = 1; j <= m;j++){
if(i-j >= 0) dp[i] += dp[i-j]; //之所以是i-j>=0 是因为 有一种走法是直接从地面跳到dp[i]
//即dp[0] -> dp[i] 这也是一种走法,所以dp[0]设置为1很巧
//正好就是加那个直接跳的dp[0] = 1
}
}
return dp[n]
746. 使用最小花费爬楼梯
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 < dp.length; i++){
dp[i] = Math.min((dp[i-1] + cost[i-1]) , (dp[i-2] + cost[i-2]));
}
return dp[dp.length-1];
}
}