最長公共子串行:
給定乙個序列x=,另乙個序列z=滿足如下條件時稱為x的子串行,即存在乙個嚴格遞增的x的下標序列對所有j=1,2...k滿足xi=zj。給定兩個序列x,y,如果既是x的子串行又是y的子串行,那就稱為x,y的公共子串行。最長公共子串行就是所有子串行中最長的乙個或幾個。
用動態規劃法來解最長公共子串行問題:
1.刻畫最長公共子串行的特徵
令x=,y=,z=是x,y的公共子串行。
lcs的最優子結構為:
1.if xm==yn 則zk==xm==yn且zk-1是xm-1,yn-1的lcs
2. if xm != yn 那麼zk!=xm意味著z是xm-1和y的lcs
3.if xm != yn 那麼zk!=yn意味著z是x和yn-1的lcs
2.遞迴解
定義c[i][j表示xi和yjlcs長度,有如下公式:
0 i==0 || j==0
c[i][j] = c[i-1][j-1]+1 i,j>0&&xi==yj
max(c[i][j-1], c[i-1][j]) i,j>0&&xi!=yj
3.計算lcs長度
用b[i][j]來儲存子問題的最優解
偽碼:(演算法導論)
c[i][j]和吧b[i][j]的跟蹤
4.構造lcs
偽碼:
實現**:
package測試資料:dp_lcs;
/***最長公共子串行
*@author
wxisme
*@time 2015-10-22 下午4:49:44 */
public
class
solve_lcs
else
if(c[i-1][j] >= c[i][j-1])
else}}
}/*** 構造lcs
* @param
i *
@param
j
*/public
static
void print_lcs(int i, int
j)
else
if(b[i][j] == 2)
else}}
public結果:static
void
main(string args) ;
y = new
char;
ret.lcs_length();
ret.print_lcs(x.length, y.length);
}
bcba
參考演算法導論第三版 最長公共子串行問題
給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...
最長公共子串行問題
最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...
最長公共子串行問題
問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...