動態規劃 最長公共子串行問題(LCS)

2021-08-31 03:25:39 字數 2388 閱讀 7553

若給定序列x=,則另一串行z= 是x的子串行 是指存在乙個嚴格遞增下標序列使得對於所有j=1,2,…,k有:zj=xij。

例如,序列z=是序列x=的子串行,相應的遞增下標序列為。給定2

個序列x和y

,當另一串行z既是

x的子串行又是

y的子串行時,稱

z是序列x和

y的公共子串行。

例如,序列x=,

y=的子串行,是x

與y的公共子串行,但不是最長公共子串行;也是x

與y的公共子串行,但它是x與

y的最長公共子串行,因為x與

y沒有長度大於

4的公共子串行。 給定

2個序列

x=和

y=,找出x和

y的最長公共子串行。

輸入:序列x的長度m,序列y的長度n;序列x各個元素,序列y各個元素

輸出:x與y的最長公共子串行,最長公共子串行的長度。

執行結果:

解法一:窮舉法,列舉出

x所有可能的子串行,並檢查它是否也是

y的子串行,從而確定它是否為公共子串行,在此過程中記錄最長的公共子串行

演算法複雜度分析: 2從x

中任意取

l個元素構成子串行,共有2m

種不同子集。     

解法二:

嘗試用動態規劃求解

最長公共子串行結構

設序列x = 和y= 的最長公共子串行為z = 則

(1)若xm = yn,zk = xm = yn,且zk-1是xm-1和yn-1的最長公共子串行。

(2)若xm!=yn且zk != xm,則z是xm-1和y的最長公共子串行。(反證法:z是xm-1和y的公共子串行,但不是最長的)

(3)若xm!=yn且zk !=yn,則z是x和yn-1的最長公共子串行。

2個序列的最長公共子串行包含了它們字首的最長公共子串行。

最長公共子串行問題有最優子結構性質。

子問題的遞迴結構

由最優子結構性質建立子問題最優值的遞迴關係 用

c[i][j]

記錄序列x和

y的最長公共子串行的長度,其中, xi

=;yj

=。 當

i=0或

j=0時,空序列是xi

和yj的最長公共子串行。故

c[i][j]=0。

其他情況下,由最優子結構性質可建立遞迴關係如下。

三、計算最優值

直接利用遞迴式的演算法是指數時間的,由於在所考慮的子問題空間中,總共有

θ(mn)(θ

是上下界符號)個不同的子問題,因此,用動態規劃演算法自底向上地計算最優值能提高演算法的效率。

b[i][j]記錄c[i][j]是由哪個子問題得到的

void lcslength(int m, int n, char *x, char *y, int c[maxn], int b[maxn])

else if(c[i-1][j] >= c[i][j-1])

else}}

四、構造最長公共子串行lcslength

只是計算出最優值,並未給出最優解,然而陣列

b可用於快速構造兩個序列的最長公共子串行:

b[i][j]=1

時表示xi和

yj的最長公共子串行是由x

i-1和

yj-1

的最長公共子串行加上xi

所得到(斜)

; b[i][j]=2

時表示xi和

yj的最長公共子串行與x

i-1和yj

的最長公共子串行相同

(上);

b[i][j]=3

時表示xi和

yj的最長公共子串行與x

i和yj-1

的最長公共子串行相同

(左)。 根據

b的內容列印出最長公共子串行

void lcs(int i, int j, char *x, int b[maxn])

else if(b[i][j] == 2)

lcs(i-1, j, x, b);

else

lcs(i, j-1, x, b);

}

動態規劃 最長公共子串行問題

最長公共子串行問題 longest common subsequence problem 簡稱lcs問題。題目為給定兩個序列x y求它們的lcs 最長公共子串行 這裡的子串行z的定義為 z中的元素既在x中也在y中,並且他們在x y中滿足嚴格的下標為乙個增序列 假設下標從左到右依次增大 另外,不要求z...

最長公共子串行問題 動態規劃

給定兩個字串s1s2.sn和t1t2.tn。求出這兩個字串最長的公共子串行 輸入 abcicba abdkscab 輸出 abca 定義dp i j 為s1 si和t1 tj對應的lcs的長度 s1 si 1和t1 tj 1對應的公共子列有三種情況 當si 1 tj 1時,在s1 si和t1 tj的...

最長公共子串行問題(動態規劃)

time limit 1000ms memory limit 65536kb problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。output 每組輸出一行,表示所求得的最長公...