動態規劃之最長公共子串行

2021-07-27 20:12:42 字數 1890 閱讀 3965

最長公共子串行簡介

舉例說明並分析

**塊測試結果

乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x=,

則另一串行z=,x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j=0,1,…,k-1有zj=xij。例如序列z=是序列x=的子串行,相應的遞增下標序列維。

最長公共子串行問題如何分解成子問題,設a=「a0,a1,…,am-1」,b=「b0,b1,…,bm-1」,並z=「z0,z1,…,zk-1」為它們的最長公共子串行。求解最長公共子串行長度。

窮舉搜尋法是最容易想到的方法,對x的所有子串行,檢查它是否也是y的子串行,從而確定它是否為x和y的公共子串行,並且在檢查過程中記錄最長的公共子串行,x的所有子串行都檢查後即可求出x和y的最長公共子串行,x的每個子串行相應與下標集的乙個子集,因此共有2的m次方個不同子串行,從而窮舉法需要指數時間。

事實上,最長公共子串行問題具有最優子結構性質。

(1) 如果am-1=bn-1,則zk-1=am-1=bn-1,且「z0,z1,…,zk-2」是「a0,a1,…,am-2」和「b0,b1,…,bn-2」的乙個最長公共子串行;

(2) 如果am-1!=bn-1,則若zk-1!=am-1,蘊涵「z0,z1,…,zk-1」是「a0,a1,…,am-2」和「b0,b1,…,bn-1」的乙個最長公共子串行;

(3) 如果am-1!=bn-1,則若zk-1!=bn-1,蘊涵「z0,z1,…,zk-1」是「a0,a1,…,am-1」和「b0,b1,…,bn-2」的乙個最長公共子串行。

這樣,在找a和b的公共子串行時,如有am-1=bn-1,則進一步解決乙個子問題,找「a0,a1,…,am-2」和「b0,b1,…,bm-2」的乙個最長公共子串行;如果am-1!=bn-1,則要解決兩個子問題,找出「a0,a1,…,am-2」和「b0,b1,…,bn-1」的乙個最長公共子串行和找出「a0,a1,…,am-1」和「b0,b1,…,bn-2」的乙個最長公共子串行,再取兩者中較長者作為a和b的最長公共子串行。

首先建立子問題最優值的遞迴關係。用c[i][j]記錄序列xi和yj的最長公共子串行的長度,b[i][j]記錄c[i][j]的值是由哪乙個子問題的解得到的。

動態規劃是自底向上進行遞迴的 那麼在計算c[i][j]之前,c[i-1][j-1]和c[i-1][j]以及c[i][j-1]都應該知道

和y開始尋找

b[i][j] = 2;

}else

和y開始尋找

動態規劃之最長公共子串行

給出兩個字串,求出這樣的一 個最長的公共子串行的長度 子串行 中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的 先後順序一致。sample input abcfbc abfcab programming contest abcd mnp sample output 4 2 0對於動...

動態規劃之最長公共子串行

最長公共子串行問題 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文...

動態規劃之最長公共子串行

給定兩個序列x和y,稱z是x和y的公共子串行,如果z既是x的子串行,又是y的子串行 最長的公共子串行稱作最長公共子串行lcs longest common subsequence 1 lcs的最優子結構 設zk是xm和yn的乙個lcs,則,如果x和y的最後乙個元素相同,則z中去掉最後乙個元素之後zk...