lcs算法c语言代码,动态规划算法-LCS
本講我們來探討動態規劃算法中一個常見的問題最長公共子序列即LCS(Long Common Sequence)。
首先我們來看一下問題描述:
有兩個序列X和Y,其中
X = {x1, x2, ..., xm}
Y = {y1, y2, ..., yn}
求X和Y的最長公共子序列長度。
例如: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:算法實現
算法實現我們將開辟新的文章來講解,敬請期待。
總結:
無論什么樣的動態規劃題目我們基本都可以按照上面的思路來求解,步驟一其實就是問題的分解,尋找合適的自變量來控制問題的規模,步驟二的遞推關系分析也有一定的規律可循,后面將開辟新的文章來分析。
總結
以上是生活随笔為你收集整理的lcs算法c语言代码,动态规划算法-LCS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html创建站点文件夹,构建及访问Web
- 下一篇: 如何搭建老板想要的dashborad管理