动态规划的定义
- 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程最优化的数学方法。
动态规划问题的特点
- 求解过程是多阶段决策过程,每步处理一个子问题。
- 每步求解的问题是后面阶段求解问题的子问题。
- 每步决策将依赖于以前步骤的决策结果。
- 问题要满足优化原则或最优子结构性质,即:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。
动态规划问题的解决步骤
- 问题建模,确定问题的决策对象。
- 列出优化的目标函数,约束条件。
- 划分子问题,界定子问题的边界。
- 判断是否满足优化原则。
- 对各阶段确定状态变量。
- 建立各阶段状态变量的转移过程,确定状态转移方程。
- 自底向上计算,设计备忘录(表格)。
- 用递推方程或备忘录估计时间复杂度
动态规划算法的实现方法
-
递归实现
动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍.。 -
迭代实现
迭代实现时每个子问题只计算一次,设计标记函数标记每步的决策,考虑根据标记函数追踪解的算法。迭代过程:从最小的子问题算起,考虑计算顺序,以保证后面用到的值前面已经计算好,用存储结构(备忘录)保存计算结果。 -
两种实现的比较
递归实现:时间复杂性高,空间消耗少。
迭代实现:时间复杂性低,空间消耗多。
递归实现子问题多次重复计算,子问题计算次数呈指数增长。迭代实现每个子问题只计算一次。
动态规划算法的时间复杂度
- 时间复杂度 = 备忘录各项计算量之和 + 追踪解工作量
- 通常追踪工作量不超过计算工作量,是问题规模的多项式函数。
动态规划算法的应用举例
动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。下面举几个常见的例子来说明。