Dynamic Programming
什么情况下可能是动态规划?
满足下面三个条件之一
- Maximum/Minimum
- Yes/No
- Count(*)
则”极有可能“是使用DP
什么情况下可能不是DP
如果题目要求出所有“具体”的方案而不是方案“个数” palindrome partitioning
输入数据是一个“集合”而不是“序列” longest consecutive sequence
4点要素
- 状态 State 灵感,创造力,存储小规模问题的结果
- 方程 Function 状态之间的联系,怎么通过小的状态,来算大的状态
- 初始化 Intialization 最极限的小状态是什么, 起点
- 答案 Answer 最大的那个状态是什么,终点
最常见的DP类型
- Matrix DP (15%)
- Sequence (40%)
- Two Sequences DP (40%)
- Others (5%)
Matrix DP
state: f[x][y] 表示我从起点走到坐标x,y…… function: 研究走到x,y这个点之前的一步 intialize: 起点 answer: 终点
Sequence DP
state: f[i]表示前i个位置/数字/字母,第i个... function: f[i] = f[j] … j 是i之前的一个位置 intialize: f[0].. answer: f[n-1]..
Two Sequence DP
state: f[i][j]代表了第一个sequence的前i个数字/字符 配上第二个sequence的前j个... function: f[i][j] = 研究第i个和第j个的匹配关系 intialize: f[i][0] 和 f[0][i] answer: f[s1.length()][s2.length()]
总结
解决动态规划问题的四点要素
- 状态
- 方程
- 初始化
- 答案
三种面试常见的动态规划类别及状态特点
- 矩阵
- 单序列
- 双序列
一些奇技淫巧
- 初始化第一行和第一列
- n个数开n+1个位置的数组