本講咱們來探討動態規劃算法中一個常見的問題最長公共子序列即LCS(Long Common Sequence)。算法
首先咱們來看一下問題描述:函數
有兩個序列X和Y,其中變量
X = {x1, x2, ..., xm}im
Y = {y1, y2, ..., yn}總結
求X和Y的最長公共子序列長度。img
例如:X={1, 3, 5, 9, 10} Y={1, 4, 9, 10},則X和Y的最長公共子序列的長度爲3,其中一個序列爲{1,9,10}。動態規劃
解題思路:文章
步驟1:用函數的形式來表示結果。
設f(x,y) = z,該函數表示X序列的長度爲x, Y序列的長度爲y,則XY序列的最長公共子序列長度爲z。
因此題目要求解的即是f(m,n)的值。
步驟2:分析遞推狀況。
接下來咱們來分析通常狀況即f(i,j)的求解。
f(i,j)表示有兩個序列
X = x1, x2, ..., xi
Y = y1, y2, ..., yj
如何求這兩個子序列的最長公共子序列的長度。
所謂的遞推關係分析其實就是分析f(i)與f(i-1)、f(i-2)...或f(0)等之間的關係,因爲本題是二元函數關係,故就是分析f(i,j)與f(i-1,j-1)、f(i-1,j)、 f(i, j-1)等之間的關係。
首先咱們來看一下f(i,j)與f(i-1, j-1)之間的關係。
f(i,j)表示的是規模分別爲i和j的兩個序列的最長公共子序列的長度,而f(i-1, j-1)表示的是規模分別爲i-1和j-1的兩個子序列的最長公共子序列的長度。
這二者之間有什麼聯繫呢?
假設咱們如今已經知道f(i-1, j-1)的最長公共子序列的長度,如今要求f(i,j)函數的值,你該如何求解?
當兩個序列的最後一個元素相等時,此時f(i,j)的值應該就是f(i-1, j-1) 的值加上1,即
f(i,j) = f(i-1, j-1) + 1, 這種狀況比較好理解。
當兩個序列的最後一個元素不等時,則咱們須要考慮f(i-1, j)和f(i, j-1)的最大值,即max{f(i-1, j), f(i, j-1)}。
綜上,咱們能夠得出下面的遞推關係式:
步驟3:算法實現
算法實現咱們將開闢新的文章來說解,敬請期待。
總結:
不管什麼樣的動態規劃題目咱們基本均可以按照上面的思路來求解,步驟一其實就是問題的分解,尋找合適的自變量來控制問題的規模,步驟二的遞推關係分析也有必定的規律可循,後面將開闢新的文章來分析。