什么是动态规划
递归可以通过不断分解问题,将复杂的任务简化为最基本的小问题,比如基于递归实现的归并排序、排列和组合。不过有时候,我们不用处理所有可能的情况,只要找到满足条件的最优解就行了。这种情况下,我们需要在各种可能的局部解中,找出那些可能达到最优的局部解,而放弃其他的局部解。这个寻找最优解的过程其实就是动态规划。
通过不断分解问题,可以将任务简化为最基本的小问题。我们需要在各种可能的局部解中,找出可能达到最优的局部解。这个寻找最优解的过程就是动态规划。
动态规划的关键
动态规划特别注重子问题之间的转移关系。我们把子问题之间的转移称为状态转移,并把用于刻画这些状态转移的表达式称为状态转移方程。找到合适的状态转移方程,就是动态规划的关键。
求状态转移方程
当搜索引擎 的搜索模框中输入单词的时候,搜索引擎会返回一系列相关的关键词,方便你直接点击。甚至,当你某个单词输入有误的时候,搜索引擎依旧会返回正确的搜索结果,这两个功能就是查询推荐。测量拉丁文相似度,最常用的指标是编辑距离。
空null | m | o | u | s | e | |
---|---|---|---|---|---|---|
空null | 0 | 1 | 2 | 3 | 4 | 5 |
m | 1 | min(2,2,0)=0 | min(3,1,2)=1 | min(4,2,3)=2 | min(5,3,4)=3 | min(6,4,5)=4 |
o | 2 | min(1,3,2)=1 | min(2,2,0)=0 | min(3,1,2)=1 | min(4,2,3)=2 | min(5,3,4)=3 |
u | 3 | min(2,4,3)=2 | min(1,3,2)=1 | min(2,2,0)=0 | min(3,1,2)=1 | min(4,2,3)=2 |
u | 4 | min(3,5,4)=3 | min(2,4,3)=2 | min(1,3,1)=1 | min(2,2,1)=1 | min(3,2,2)=2 |
s | 5 | min(4,6,5)=4 | min(3,5,4)=3 | min(2,4,3)=2 | min(2,3,1)=1 | min(3,2,2)=2 |
e | 6 | min(5,7,6)=5 | min(4,6,5)=4 | min(3,5,4)=3 | min(2,4,3)=2 | min(3,3,1)=1 |
我们假设字符数组A[]和B[]分别表示字符串A和B,A[i]表示字符串A中的第i个位置的字符,B[i]表示字符串B中第i个位置字符。
有了这些定义,我们就可以用迭代来表达上述的推导过程