一般形式:求最值
核心问题:穷举
三要素:
- 重叠子问题:使用备忘录/DP table优化
- 最优子结构:通过子问题的最值得到原问题的最值
- 状态转移方程
明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义
# 初始化 base casedp[0][0][...] = base# 进行状态转移for 状态1 in 状态1的所有取值:for 状态2 in 状态2的所有取值:for ...dp[状态1][状态2][...] = 求最值(选择1,选择2...)
- 自顶向下:带备忘录的递归解法
- 自底向上:动态规划(迭代)
状态压缩
每次状态转移只需要 DP table 中的一部分,那么可以尝试用状态压缩来缩小 DP table 的大小
