~/wikiLeon 的个人知识库
[97]

# 动态规划

动态规划

动态规划(Dynamic Programming,简称 DP)是一种算法思想:将一个复杂的最优化问题,分解为若干相互重叠的子问题,通过求解子问题的最优解,推导出全局最优解。 "规划"一词在数学上的含义是"优化",与编程无关。

最直观的应用:导航系统的最短路径规划,以及拼音输入法的汉字选择——两件看似毫无关系的事,背后是完全相同的数学模型。


核心原理:最优子结构

最短路径的最优子结构性质: 若北京→广州的最短路径经过郑州,则北京→郑州这段,必然也是北京→郑州所有路径中最短的。

证明(反证法): 假设存在北京→郑州更短的路径,用它替换原来那段,就能得到北京→广州更短的全程路径——这与"原路径已是最短"矛盾。

这个性质使得我们可以从局部最优推出全局最优。


导航系统:最短路径问题

暴力穷举的复杂度: 中国城市数量 N 个,所有可能路径数约为 N! 级别——每增加一个城市,复杂度翻倍,计算机也无法承受。

动态规划的方法: 在地图上横切一刀,确保任何北京→广州的路径都会经过这条切线上的某个城市。先找出北京到切线上所有城市的最短路径,然后将切线向广州推移,重复这个过程:

flowchart LR BJ[北京] --> 切线1 subgraph 切线1 C1A[城市A] C1B[城市B] C1C[城市C ...] end 切线1 --> 切线2 subgraph 切线2 C2A[城市X] C2B[城市Y ...] end 切线2 --> GZ[广州]

复杂度对比(每条切线平均 10 个城市,全程 15 段):

方法 计算量
穷举所有路径 10¹⁵(千万亿次)
动态规划 10 × 10 × 15 = 1500 次

相差约万亿倍。


拼音输入法:相同的数学

将拼音转汉字看作一个图:每个拼音对应多个候选汉字,相邻汉字间的边权重 = 两词共现的语言模型概率(取对数后变为距离)。

输入"wo ai zhong guo",图中可能有:

我/喔/窝  →  爱/埃  →  中/钟/众  →  国/郭/果

寻找"最合理的句子" = 在这张图中寻找"最短路径"(概率最大的路径)。算法同样是动态规划。

同一数学模型的两个应用:

  • 导航:最小化物理距离或时间
  • 输入法:最大化语言模型概率(等价于最小化负对数概率)

维特比算法

动态规划在 HMM(隐含马尔可夫模型)中的具体实现,称为维特比算法 (Viterbi Algorithm)。

维特比算法用于:语音识别(从声学观测序列找最可能的词序列)、中文分词(从字序列找最可能的词序列)、词性标注。

三个经典算法中,维特比算法是应用最广的数字通信算法之一(另一个是 IBM 的 BCJR 算法)。


与贪心算法的区别

贪心算法 每一步都选局部最优,不回头。在最短路径中,贪心可能陷入局部最优:先走一步近路,结果后续全是远路。

动态规划 系统地考虑所有子问题,通过递推保证全局最优。代价是需要存储中间结果(空间换时间)。

动态规划的本质是:用对子问题的记忆(memoization),避免重复计算,将指数级复杂度降到多项式级。


延伸

动态规划广泛应用于计算生物学(DNA 序列比对)、金融(期权定价)、机器翻译(束搜索近似动态规划)。吴军在《数学之美》中用导航和输入法这两个日常例子,揭示了"看似不同的问题背后数学模型完全相同"的数学之美。