动态规划与分治法
1 动态规划
动态规划的特点
- 把原始问题划分为一系列子问题
- 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间
- 自底向上地计算
动态规划的核心思想
- 动态规划算法的核心就是记住已经解决过的子问题的解,后续问题不断查找之前的解得到答案
动态规划的使用范围
- 一类优化问题:可分为多个相关子问题,子问题的解被重复使用
动态规划的设计步骤
- 分析优化解的结构
- 递归地定义最优解的代价
- 自底向上地计算优化解的代价保存之,并获取构造最优解的信息
- 根据构造最优解的信息 构造优化解 (核心关键) (即获取状态转换函数)
动态规划的常用案例
- 编号动态规划:输入为 x1, x2, …, xn,子问题是 x1,x2, …, xi 子问题复杂性为O(n)
(最大不下降子序列问题) - 划分动态规划:输入为x1,x2,…,xn,子问题为xi,xi+1,…,xj,子问题复杂性是O(n2)(矩阵链乘问题)
- 数轴动态规划:输入为x1,x2,…,xn和数字C,子问题为x1,x2,…,xi,K(K≤C)K(K≤C),子问题复杂性O(nC)(0-1背包问题)
- 前缀动态规划:输入为x1,x2,…,xn和y1,y2,…,ym,子问题为x1,x2,…,x和y1,y2,…,yj,子问题复杂性是O(mn)(最长公共子序列问题)
- 树形动态规划:输入是树,其子问题为子树,子问题复杂性是子树的个数。(树中独立集合问题)
2 分治法
分治法的特点
- 分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问题合并起来,大问题就解决了
能使用分治法的特征
- 问题缩小到一定规模容易解决
- 分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质
- 分解而成的小问题在解决之后要可以合并
- 子问题是相互独立的,即子问题之间没有公共的子问题
分治法与动态规划的不同
- 分治法会用到递归的方法,不断调用原函数得到答案。
- 动态规划则不会,只是需要用到循环,通过状态转移函数得到答案。
分治法两个例题