動態規劃 最長公共子串行(演算法設計課題)

2021-07-24 18:22:29 字數 944 閱讀 9272

問題描述:

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

是序列x=的子串行,相應的遞增下標序列為。

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

給定2個序列x=和y=,找出x和y的最長公共子串行。

解題思路:

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

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

(2)若xm≠yn且zk≠xm,則z是xm-1和y的最長公共子串行。

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

由於在所考慮的子問題空間中,總共有θ(mn)個不同的子問題,因此,用動態規劃演算法自底向上地計算最優值能提高演算法的效率。

#include#include#define maxlen 100

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

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

else}}

}void printlcs(int b[maxlen],char *x,int i,int j)

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

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

else

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

}int main(int argc, char **argv)

return 0;

}

動態規劃 最長公共子串行

問題描述 我們稱序列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 的乙...