Outline
- 动态规划原理
- 编号动态规划:最大不下降子序列
- 划分动态规划:矩阵链乘、凸多边形三角剖分
- 数轴动态规划:0-1背包
- 前缀动态规划:最长公共子序列
- 树形动态规划:最优二分搜索树
Notes
## 动态规划原理
- 基本思想:问题的最优解如果可以由子问题的最优解推导得到,则可以先求解子问题的最优解,在构造原问题的最优解;若子问题有较多的重复出现,则可以自底向上从最终子问题向原问题逐步求解。
- 使用条件:可分为多个相关子问题,子问题的解被重复使用
- Optimal substructure(优化子结构):
- 一个问题的优化解包含了子问题的优化解
- 缩小子问题集合,只需那些优化问题中包含的子问题,降低实现复杂性
- 我们可以自下而上的
- Subteties(重叠子问题):在问题的求解过程中,很多子问题的解将被多次使用。
- Optimal substructure(优化子结构):
- 动态规划算法的设计步骤:
- 分析优化解的结构
- 递归地定义最优解的代价
- 自底向上地计算优化解的代价保存之,并获取构造最优解的信息
- 根据构造最优解的信息构造优化解
- 动态规划特点:
- 把原始问题划分成一系列子问题;
- 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间
- 自底向上地计算。
- 整体问题最优解取决于子问题的最优解(状态转移方程)(将子问题称为状态,最终状态的求解归结为其他状态的求解)
## 编号动态规划:最大不下降子序列
本类的状态是基础的基础,大部分的动态规划都要用到它,成为一个维。
-
最长不下降子序列定义:从序列中选出若干个数组成一个新的序列,不改变他们的队伍的顺序,要求新的序列里xi≤xi+1≤xi+1.....举个例子{4,6,5,7,3},最长不下降子序列就是{4,6,7}。
- 子问题的表示:令dp[i]表示以第i个元素结尾的前i个元素构成的最长不下降子序列的长度
- 优化子结构:若最长不下降子序列包括ak,则必有一个解包含a1,a2…ak-1的最长不下降子序列,dp[i]表示为前i个元素的序列的最长不下降子序列
- 方程: dp[i] = max{dp[j] | 0<j<i , aj≥ai} + 1
- 伪代码:
输入a[1,...,n] 输出:最长子序列
时间复杂度:O(n^2)
## 划分动态规划
【矩阵链乘】
- 优化子结构:若计算A1~n的优化顺序在k处断开矩阵链, 即A1~n=A1~k × Ak+1~n,则在A1~n的优化顺序中,对应于子问题A1~k的解必须是A1-k的优化解,对应于子问题Ak+1~n的解必须是Ak+1~n的优化解
- 子问题重叠性: