Dynamic Programming
Dynamic Programming
由大化小, 小问题存在交集, 解决重复计算
DP 的实现方式
记忆化搜索 (递归)
循环
自顶向下
自底向上
如何想到需要用 DP 来解题?
one of the following three indicators in problem description
max
/min
yes
/no
(能否 ....)count(*)
原数组/序列不能排序, 交换位置 (不允许改变)
DP 四个要素
状态 State
f[][]
表示 ....
方程 Function
研究如何从上一步走到下一步
初始化 Initialization
对那几个点进行初始化
答案 Answer
答案在哪里?
f[n]
?f[0]
?
整理的 4
种 典型 DP
4
种 典型 DPMatrix DP
Sequence DP
Two Sequences DP
Backpack DP
Matrix DP
状态 State
f[x][y]
表示从起点走到坐标(x, y)
的 .....
方程 Function
研究走到
(x, y)
这个点之前的一步
初始化 Initialization
对那几个点进行初始化? 边界? 顶点
答案 Answer
答案在哪里?
f[n]
?f[0]
?
例题
Minimum Path Sum
Unique Path Sum I
Unique Path Sum II
解析
pass
Sequence DP
State:
f[i]
表示"前i"个位置/数字/字母, (以第i
个为).....Function:
f[i] = f[j]
....j < i
Initialization:
f[0
] ....Answer:
f[n - 1]
...
例题
Climbing Stairs
Jump Game
Palindrome Partitioning II
Word Break
Longest Increasing Subsequence
解析
pass
Two Sequence DP
State:
f[i][j]
代表第一 sequence 的前i
个数字/字符, 配上第二个 sequence 的前j
个数字/字符, .....Function:
f[i][j]
研究 第 i 个和第 j 个的匹配关系Initialization:
f[i][0]
和f[0][i]
Answer:
f[s1.length()][s2.length()]
例题
Longest Common Subsequence
Longest Common Substring
Edit Distance
Distinct Subsequences
Interleaving String
解析
pass
Backpack
n
个整数 a[1, ..., n]
, 装满 m 的背包
State:
f[i][j]
"前 i" 个数, 能否组成和为 jFunction:
f[i][j] = f[i -1][j - a[j]] or f[i - 1][j]
Initialization:
f[x][0] = True
,f[0][1, ...., m] = False
Answer: 使得
f[n][x]
最大的 (0 <= x <= m
)
例题
Backpack
Backpack II
K Sum
Minimum Adjustment Cost
解析
pass
Last updated