51NOD 最長公共子串行問題

2021-08-05 22:58:20 字數 862 閱讀 7114

最長公共子串行問題就是求序列a= a1,a2,……an, 和b = b1,b2,……bm,的乙個最長公共子串行。

因為最長公共子串行不唯一,讓我們把問題簡化,如何求出兩個序列的最長公共子串行長度呢?

你首先能想到的恐怕是暴力列舉?那我們先來看看:序列a有 2^n 個子序列,序列b有 2^m 個子序列,如果任意兩個子串行一一比較,比較的子串行高達 2^(n+m) 對,這還沒有算具體比較的複雜度。

或許你說,只有長度相同的子串行才會真正進行比較。那麼忽略空序列,我們來看看:對於a長度為1的子串行有c(n,1)個,長度為2的子串行有c(n,2)個,……長度為n的子串行有c(n,n)個。對於b也可以做類似分析,即使只對序列a和序列b長度相同的子串行做比較,那麼總的比較次數高達:

c(n,1)*c(m,1)*1 + c(n,2) * c(m,2) * 2+ …+c(n,p) * c(m,p)*p

其中p = min(m, n)。

嚇著了吧?怎麼辦?試試使用動態規劃演算法!

最後,我們來提供輸入輸出資料,由你來寫一段程式,實現這個演算法,只有寫出了正確的程式,才能繼續後面的課程。

輸入

第1行:字串a

第2行:字串b

(a,b的長度 <= 1000)

輸出

輸出最長的子串行,如果有多個,隨意輸出1個。

輸入示例

abcicba

abdkscab

輸出示例

abca

我們lcs(x,y)的值**的三種情況:

51NOD 最長公共子串行問題

給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 比如兩個串為 abcicba abdkscab ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長的子串行。輸入 第1行 字串a 第2行 字串b a,b的長度 1000 輸出 輸出最長的子串行,如果有多個,...

51nod 最長公共子串行測試 LCS 回溯

輸入 第1行 字串a 第2行 字串b a,b的長度 1000 輸出 輸出最長的子串行,如果有多個,隨意輸出1個。輸入示例 abcicba abdkscab 輸出示例 abca 這道題比較6,但是利用每個位置的記錄進行回溯就更6,好好體會下。include include include includ...

51nod動態規劃入門 最長公共子串行

題目 給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 輸入 第1行 字串a 第2行 字串b a,b的長度 1000 輸出 輸出最長的子串行,如果有多個,隨意輸出1個。輸入示例 abcicba abdkscab 輸出示例 abca 如下 include include includ...