【算法】4-动态规划
简介
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解原问题(在这里,“programming”指的是一种表格法,并非编写计算机程序)。
分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治算法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划对每个子子问题仅求解一次,并将其解保存于表格之中,从而无需每次求解相同子子问题时都要重新计算,避免了这种不必要的计算工作。
动态规划方法通常用于求解最优化问题(optimization problem)。这类问题可以有很多可行解,每个解都有一个值(我们称之为代价),我们希望寻找具有最优值(通常为最大值或者最小值)的解。我们称这样的解为问题的一个最优解(an optimal solution),而不是最优解(the optimal solution),因为有可能有多个解达到最优值。
使用条件
- 优化子结构
- 当一个问题的优化解包含了子问题的优化解释,我们说这个问题具有优化解结构。
- 重叠子问题
- 在问题的求解过程中,很多子问题的解将被多次使用
求解步骤
- 分析优化解的结构
- 递归地定义最优解的代价
- 递归地划分子问题,直至不可分
- 自底向上地求解各个子问题
- 计算优化解的代价并保存
- 获取最优解的信息
- 根据构造最优解的信息构造优化解
最优解的证明
反证法
具体问题
矩阵链乘
问题的定义
- 输入: <A1,A2,… ,An>, Ai是pi-1×pi矩阵
- 输出:计算 A1×A2×… ×An的最小代价方法
代价方程
i = j : m[ i , j ] = 0
i ≠ j : m[ i , j ] = mini≤k<j{m[ i , k ] + m[ k+1 , j] + pi-1pkpj}
最长公共子序列
问题的定义
- 输入:X = (x1,x2,…xm), Y = (y1,y2,…yn)
- 输出:X与Y的最长公共子序列Z = (z1,z2,…,zk)
代价方程
0/1背包问题
二叉搜索树
参考文献
[1]百度百科.动态规划[EB/OL].https://baike.baidu.com/item/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/529408?fr=aladdin,2018-06-07.
[2]Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest,etc.算法导论[M].机械工业出版社:北京,2013:204-236.