动态规划的核心思想就是穷举求最值,但是问题可以干变万化,穷举所有可行解其实并不是一件容易的事,只有列出正确的状态转移方程才能正确地穷举。
具体思路: 明确状态 -> 定义 dp 数组/函数的含义 -> 明确选择及明确 base case。
可以运用的方法: dp数组, 递归
具体代码:
class Solution {
public int fib(int n) {
// 创建dp数组
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
return fib(n, new int[n + 1]);
}
public int fib(int n, int[] dp){
// base case
if(n == 1 || n == 2) return 1;
if(dp[n] != 0) return dp[n];
dp[n] = fib(n-1, dp) + fib(n-2, dp);
return dp[n];
}
}
class Solution {
public int climbStairs(int n) {
if(n ==1) return 1;
// dp数组
int[] dp = new int[n+1];
return climbStairs(n, dp);
}
public int climbStairs(int n, int[] dp){
// base case
if(n < 0) return 0;
if(n == 1 || n == 0) return 1;
if(dp[n] != 0) return dp[n];
dp[n] = climbStairs(n-1, dp) + climbStairs(n-2,dp);
return dp[n];
}
}