1. 理解动态规划
1.1 递推!(递归+记忆化)
1.2 状态的定义:opt[n], dp[n], fib[n]
1.3 状态转移方程:opt[n] = best_of(opt[n-1], opt[n-2], …)
1.4 最优子结构
2. 动态规划例子
2.1 斐波那契数列
2.2 count the paths(计算路径数)
2.2.1 递归解法
解释:小人只能向右走,或者向下走。
int countPaths(boolean[][] grid, int row, int col){
if (!validSquare(grid, row, col) // 遇到石块,走0步!
return 0;
if (isAtEnd(grid, row, col)) // 走到end,只需一步!
return 1;
// 向下走的个数+想右走的个数!
return countPaths(grid, row-1, col) + countPaths(grid, row, col+1);
}
2.2.2 动态规划解法
解释:从end位置开始,往上递推!
package DP;
public class _62_uniquePaths {
public int uniquePaths(int m, int n){
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++){
dp[i][0] = 1;
}
for (int j = 0; j < n; j++){
dp[0][j] = 1;
}
for (int i = 1; i < m; i++){
for (int j = 1; j < n; j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
// 时间复杂度O(M)(N)