“数值方面,本定理是不动点迭代收敛性分析的原型:误差界表明达到精度 $\varepsilon$ 只需 $O(\log(1/\varepsilon))$ 次迭代。在动态规划中,带折扣因子的 Be…”
形式陈述 ​
动态规划把问题写成状态集
优化问题常有
但计数、可达性、概率传播和字符串识别使用的是相应合并运算,并不需要“最优子结构”。若有
若状态依赖含环,单纯按表格顺序代入已无定义。一种严格的扩展是先给状态值域配备偏序,再把全部状态方程写成单调算子
直觉
动态规划先问“未来究竟需要哪些过去信息”,再把这份充分摘要定义为状态。当两条路径得到同一状态时,它们的后续计算便可合并。状态太少会丢失影响未来的信息,太多则把整段历史原样带入。因此核心工作是证明状态充分、转移完备,并给出合法求值顺序。
例子与边界
动态规划主动识别并合并相同子问题,以状态表或记忆化避免重复计算;回溯法沿选择树枚举候选,并靠可行性或界限剪枝撤销选择。两者可以组合,但“存在递归分支”并不足以构成动态规划。
Fibonacci 递归的调用树重复解同一下标,记忆化后只剩
状态设为“当前价值”却不保留已用容量,通常无法决定背包的后续可行性;反过来,把所有已选集合当作状态虽然充分,却退化为指数枚举。“写出了递推式”只是起点;还必须证明状态确实包含后续所需的全部信息,转移覆盖了所有合法情形,且所选求值规则真能得到指定的解。
推论与应用
记忆化以需求驱动方式解状态,表格法则按依赖顺序主动求值。动态规划可用于 DAG 最短路、序列比对、背包、矩阵链乘、区间问题、树分解、概率模型与有限时域控制。其中计数、概率与可达性例子也说明,动态规划的主体是状态方程的有效求值,而不是优化问题所特有的“最优子结构”。它与分治的分界是是否复用重叠状态,与贪心的分界则是是否保留多种中间可能后再比较。
高级 DP 仍应从状态 DAG 看待,而不是把新技巧当模板名。子集动态规划把
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Part III, dynamic programming, state recurrences and reconstruction。
- Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,Ch. 6, dynamic programming and optimal substructure。