動態規劃算法-LCS

本講咱們來探討動態規劃算法中一個常見的問題最長公共子序列即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:算法實現

算法實現咱們將開闢新的文章來說解,敬請期待。

 

總結:

不管什麼樣的動態規劃題目咱們基本均可以按照上面的思路來求解,步驟一其實就是問題的分解,尋找合適的自變量來控制問題的規模,步驟二的遞推關係分析也有必定的規律可循,後面將開闢新的文章來分析。

相關文章
相關標籤/搜索