動態規劃 最長公共子串行

2021-10-17 19:07:39 字數 940 閱讀 7925

#include

#include

#define m 7

#define n 6

intlcslength

(char

*x,char

*y,int c[m]

[n],

int b[m]

[n])

//計算最長公共子串行

//c[i][j]儲存兩序列最長公共子串行長度,b[i][j]記錄c[i][j]的值是由哪乙個子問題的解得到的

else

if(c[i-1]

[j]>=c[i]

[j-1])

else

}return c[m]

[n];

//問題的最優值存放在c[m][n]中

}void

lcs(

int i,

int j,

char

*x,int b[i]

[j])

else

if(b[i]

[j]==2)

//當b[i][j]=2時,最長公共子串行是x的前i-1個與y的前j個的最長公共子串行

lcs(i-

1,j,x,b)

;else

//當b[i][j]=3時,最長公共子串行是x的前i個與y的前j-1個的最長公共子串行

lcs(i,j-

1,x,b);}

intmain()

,y[n]=;

t=lcslength

(x,y,c,b)

;printf

("the length is %d\n"

,t);

printf

("the sequence is");

lcs(m,n,x,b)

;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 的乙...