花花酱 DP 算法模板笔记
- DP 基础可以参考Algorithm Dynamic Planning
DP 的定义
-
DP(Dynamic Planning) is aprogramming method.
- optimal substructure 当前最优解由多个子最优解推导得出
- overlapping sub-problems 子问题会被重复计算,使用 DP 可以避免重复计算从而降低时间复杂度
- No-after effect 无后效性,子问题的最优解一旦确定,在计算后面问题时就不需要再改变
-
DP 通常可以由”recur+memory”推导而来,DP 的优势是通过定向推导避免重复计算实现了降维
分类表
Case | Input | Subproblems | Depends on | Time | Space | Problem IDs |
---|---|---|---|---|---|---|
1.1(1) | O(n) | O(n) | O(1) | O(n) | O(n)->O(1) | 70, 198, 746, 790, 801 |
1.2(1) | O(n) | O(n) | O(n) | O(n^2) | O(n) | 139, 818 |
1.3(1) | O(n)+O(m) | O(mn) | O(1) | O(mn) | O(mn) | 72(712) |
1.4(2) | O(n) | O(n^2) | O(n) | O(n^3) | O(n^2) | 312, 664, 673 |
1.5(3) | O(n) | O(n^3) | O(n^3) | O(n^4) | O(n^3) | 546 |
1.6(1) | O(n), k | O(k) | O(n) | O(kn) | O(k) | 322, 494 |
1.7(2) | O(n), k | O(kn) | O(n) | O(kn^2) | O(kn) | 813 |
2.1(1) | O(nm) | O(nm) | O(1) | O(nm) | O(nm)->O(m) | 64(62, 63) |
2.2(2) | O(nm) | O(kmn) | O(1) | O(kmn) | O(kmn)->O(mn) | 688, Floyd-Warshall, 576, 741 |
-
列名
- Case 模式,1 表示输入为 1 维,2 表示输入为 2 维,
(x)
表示难易度(数字越大越难) - Input 输入规模
- Subproblems 子问题数
- Depends on 每个子问题的复杂度
- Time 时间复杂度
- Space 空间复杂度,
->
表示可以优化 - Problem IDS 在 LeetCode 中的序号,
()
表示非常相似的题
- Case 模式,1 表示输入为 1 维,2 表示输入为 2 维,
-
规律
- 对于
Depends on O(1)
的,通常 Space 可以降维
- 对于
模板
1.1
1 |
|
1 |
|
1.2
1 |
|
1 |
|
1 |
|
1 |
|
1.3
1 |
|
1 |
|
1.4
1 |
|
1 |
|
1 |
|
1 |
|
2.1
1 |
|
1 |
|
2.2
1 |
|
1 |
|
1 |
|