动态规划:高效递归的艺术
1. 动态规划基础
动态规划由理查德·贝尔曼在1950年提出,用于描述多阶段决策过程的研究。如今,它作为一种算法设计技术,涉及两个阶段:首先将问题用递归形式表述,然后找到高效的计算解决方案的方法。与分治算法不同,递归解决方案产生的子问题可能会重叠,直接执行递归算法可能会多次求解相同的子问题,导致指数级的时间复杂度。
为了理解子问题重叠的问题,可以查看与递归函数相关的依赖图。分治算法的依赖图是没有共享顶点的树,而动态规划算法的依赖图是有向无环图,可能有许多共享顶点。
解决优化问题的第一步是获得递归解决方案,关键是利用合适的单调性条件,使问题的最优解可以用最优子解表示。获得递归描述后,有两种方法确保子解不被多次计算:
- 记忆化(Memoisation) :保留递归的自顶向下结构,将子解存储在表中,每次递归调用时先检查该调用是否已执行过,若是则从表中检索解,否则递归计算并存储结果。
- 制表法(Tabulation) :采用自底向上的方案,先计算最简单的部分结果,然后按适当顺序计算更大子问题的解,直到得到完整解。
| 方法 | 优点 | 缺点 |
|---|---|---|
| 记忆化 | 原理上易于实现,确保只计算完整计算所需的值 | 需要对递归函数的参数进行系统编码,参数需可进行相等性测试 |
超级会员免费看
订阅专栏 解锁全文
692

被折叠的 条评论
为什么被折叠?



