● 509. 斐波那契数 Fibonacci Number - LeetCode
动规五部曲:
1.确定dp[i]含义:dp[i] :第i个fibo的dp[i]
2.递推公式:dp[i] = dp[i - 1] + dp[i - 2]
3.dp数组如何初始化:dp[0] = 1, dp[1] = 1
4.遍历顺序 :从前向后
5.打印dp数组
int[] dp = new int[n + 1]
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i < n; i++)
dp[n] = dp[n - 1] + dp[n - 2];
return dp[n];
可以只维护3个变量
int sum = dp[0] + dp[1];
dp[0] = dp[i]
dp[i] = sum;
class Solution {
public int fib(int n) {
if (n == 0) return 0;
int[] fibF = new int[n + 1];
fibF[0] = 0;
fibF[1] = 1;
for (int i = 2; i <= n; i++) {
fibF[i] = fibF[i - 1] + fibF[i - 2];
}
return fibF[n];
}
}
● 70. 爬楼梯 Climbing Stairs - LeetCode
0阶 1种
1阶 2种
2阶 3种
3阶 5种
dp[i]:达到i阶有dp[i]种方法
dp[i - 2]: 达到i阶有dp[i - 2]种方法
dp[i - 1]: 达到i阶有dp[i - 1]种方法
dp[i] = dp[i - 2] + dp[i - 1]
dp[0] = 1;
dp[1] = 1;
class Solution {
public int climbStairs(int n) {
if (n <= 1) return n;
int[] dp = new int[n + 1];
dp[1] = 1;//第一个台阶有1种方法
dp[2] = 2;//第二个台阶有2种方法
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 2] + dp[i - 1];
}
return dp[n];
}
}
● 746. 使用最小花费爬楼梯 Min Cost Climbing Stairs - LeetCode
dp[i]到达i位置的花费为dp[i]
状态转移dp[i] = Min(dp[i - 1]+ cost[i - 1] , dp[i - 2] + cost[i - 2])
初始化 dp[0] = 0;
dp[1] = 0; 往上跳才有cost,起始位置可以是0或1
遍历顺序:
打印dp数组 dp[n]
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i <= n; i++) {
dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[n];
}
}