本文参考UCAS卜东波老师算法设计与分析课程撰写
前言
本文依然围绕动态规划问题展开,会详细描述动态规划在序列联配问题中的应用,通过这个问题引出高级动态规划,以及以算代存的方式减少动态规划占用的内存。
序列联配问题
问题描述与分析
-
给你两个字符串序列 x = x 1 x 2 . . . x n x = x_1x_2...x_n x=x1x2...xn, y = y 1 y 2 . . . y n y = y_1y_2...y_n y=y1y2...yn,计算联配 ( x ′ , y ′ ) (x',y') (x′,y′),使得编辑操作数目 s ( x ′ , y ′ ) s(x',y') s(x′,y′)最小
首先解读一下问题,想象这样一个场景,我们拥有一个字典词库,对于用户输入的单词S(可能输错),我们需要尽快地找到词库中与它最像的单词(动态规划保证这一过程尽可能快),修正用户的输入。为此我们引入“对齐”的概念。拿到两个字符串T&S,我们对字符串每个对应位置的元素做以下判断:
- S ′ [ i ] S'[i] S′[i]=’-’: S [ i ] S[i] S[i]相比于 T [ i ] T[i] T[i] 少了一个字母,称作删除
- T ′ [ i ] T'[i] T′[i]= ‘-’: S ′ [ i ] S'[i] S′[i]相比于 T [ i ] T[i] T[i]多了一个字母,称作插入
- S [ i ] S[i] S[i]与 T [ i ] T[i] T[i]位置元素相同,称作匹配
简而言之,就是给了 ( S , T ) (S,T) (S,T)要转换到 ( S ′ , T ′ ) (S',T') (S′,T′),使得 ( S ′ , T ′ ) (S',T') <