動態規劃 尋找最長公共子串行

2021-10-11 23:58:58 字數 1658 閱讀 3418

乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。若給定序列x=,則x的子串行是指存在乙個嚴格遞增下標序列;例如:序列z=是序列x=的子串行,相應的遞增下標序列為.注意(不一定是連續的)

給定兩個序列x和y,當另一串行z即是x的子串行又是y的子串行時,稱z是x和y的公共子串行。

void

printvector

(vectorint>>

& c)

cout << endl;

} cout << endl;

}int

lcslength

(char

* x,

char

* y,

int i,

int j,vectorint>>

&c,vectorint>>

&s)else

if(c[i]

[j]>0)

return c[i]

[j];

else

else

}return c[i]

[j];}}

void

printitem

(char

* x,

int i,

int j, vectorint>>

& s)

else

if(s[i]

[j]==2)

else

}}

int

nicelcslength

(char

* x,

char

* y,

int m,

int n, vectorint>>

& c,vectorint>>

&s)else

if(c[i-1]

[j]> c[i]

[j-1])

else}}

return c[m]

[n];

}

主程式測試:

int

main()

;char y=

;int mx =

strlen

(x)-1;

int ny =

strlen

(y)-1;

vectorint>> c,s;

c.resize

(mx +1)

; s.

resize

(mx +1)

;for

(int i =

0; i < mx +

1; i++

)//printvector(c);

//int maxlen = lcslength(x, y, mx, ny,c,s);//遞迴

int maxlen =

nicelcslength

(x,y,mx,ny,c,s)

;//非遞迴

printvector

(c);

printvector

(s);

cout << maxlen << endl;

printitem

(x, mx, ny, s)

;return0;

}

動態規劃 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...