基本思想
动态规划的基本思想是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解;这些求解的子问题往往不是相互独立的;另外,在计算过程中需要将所有已解决的子问题的答案记录在一个表中以避免大量的重复计算。
基本步骤:
- 找出最优解性质,刻画其结构特征
- 递归或迭代地定义最优值
- 自底向上的计算最优值
- 根据最优值,构造最优解
影响算法复杂度的因素
- 最优子结构问题(时间)
【最优子结构:最优解包含着子问题的最优解】 - 子问题的重叠问题(时间)
- 备忘录大小(空间)
【对于动态规划算法,因为递归实现的效率不高,因此采用空间换时间的策略,记录每个子问题首次计算的结果,后面再用时直接取值,每个子问题就计算一次】
适用条件
可用于求解组合优化问题,但是需要满足优化原则或者最优子结构性质,即最优解包含着子问题的最优解。
经典案例
1、最短路径
实例
起点集合是S,终点集合是T,输出是一条从起点到终点的最短路,方法是从底向上的计算,先计算从C到终点的最短路径,然后再依据C选择的结果,计算B到T的最短路。
2、矩阵相乘
实例
伪码
递归:
迭代:
迭代实现与递归实现的比较
3、0-1揹包问题
实例
追踪解:
伪码
4、图像压缩
设计思想
实例
伪码
5、最优二叉树
方法
实例
参考
mooc 算法分析与设计