1. 简介
通过子问题最优解推出当前最优解
初始化
2. DP模型
2.1 DAG图
嵌套矩形问题。有 n 个矩形,每个矩形可以用两个整数 a、b 描述,表示他的长和宽。矩形 X(a,b) 可以嵌套在 Y(c,d) 中,当且仅当 a<b, b<d 或者 b<c, a<d。你的任务是选出尽量多的矩形排成一行,使得除了最后一个之外,每一个矩形都可以嵌套在下一个矩形中。
结点与结点之间存在一个典型的二元关系,二元关系可以用图来建模。举个例子:
如果这个关系满足如下条件,那么这个图就是 DAG 图。
这里的>只是举个例子,其他符号也行。
对于这类 DAG 图问题,可以使用如下状态转移方程
可以使用记忆化搜索或者递归方式求解,记忆化有个缺陷就是多个解就要多个函数。
| 分类 | 题目 | 描述 |
|---|---|---|
| DAG图 | 巴比伦塔 UVa437 | 基本嵌套变种 |
| 城市里的间谍 UVa1025 | 加上时间纬度 | |
| Tour UVa1347 | ||
| 最大食物链 P4017 | 最长路 | |
| 木棍加工 |
a: t为时间、i 和 j 为车站, dp为 t 时刻 i 车站最小等待时间,C为从 j 坐火车到 i 的时间
b: 把一个人从起点到终点来回旅行,等价替换为两个人从起点一起走到终点…
令 dp(i, j) 为已经访问过max(i,j)所有结点后,一个人在 i ,一个人在 j,此时到终点两人还需要走的距离
边界条件为 dp(n-1, j) ,这个时候只要令人分别走到终点即可。
2.2 多阶段决策
简单地说,每做一次决策就可以得到解的一部分,当所有决策做完之后,完整的解就“浮出水面”了。
| 分类 | 题目 | 描述 |
|---|---|---|
| 多段图 | 单向 TSP | TSP旅行商问题 |
| 背包问题 | 采药 | |
| 疯狂的采药 | ||
| 5倍经验日 |
2.3 线性动态规划
问题分类:
| 分类 | 题目 | 描述 |
|---|---|---|
| LIS问题 | 导弹拦截 | 巧用lower_bound达到o(nlogn) |
| LCS问题 | 编辑距离 | |
| 最长公共子序列 | 看上去LCS,其实是LIS… | |
| 最优矩阵链乘 | 经典问题 | |
| 最优三角剖分 | 经典问题 | |
| 其他 | 回文分区 | |
| 切木棍 | 四边形不等式 | |
| 正则表达式匹配 |
2.4 区间动态规划
| 题目 | 描述 |
|---|---|
| 合并石子 | |
2.5 树与图上的动态规划
| 题目 | 描述 |
|---|---|
| 树的重心 | 经典问题 |
| 树的最大独立集 | 经典问题 |
| 打家劫舍III | |
| 树的最远距离 | 经典问题 |
2.6 状态压缩动态规划
2.7 暂未分类
| 题目 | ||
|---|---|---|
| zero remainder sum | 多个背包+余数限制 | |
| even harder | TODO | |
| Mathematical Expression | TODO | |
| String and Operations | TODO |
