最長公共子序列問題:給定兩個序列X={x1,x2,....xm}, Y={y1,y2,yn},找出XY的最長公共子序列spa
1 最長公共子序列結構code
1 xm=yn,則zk = xm = yn,且zk-1是xm-1和yn-1的最長公共子序列blog
2 xm!=yn,zk!=xm,則Z是xm-1,yn的最長共公共子序列遞歸
3 xm!=yn,zk!=yn,則Z是xm,yn-1的最長公共子序列class
2 子問題的遞歸結構di
1 xm=yn時,找出xm-1,yn-1的最長公共子序列co
2 xm!=yn時,找出xm 和 yn-1 或者 xm-1和yn的最長公共子序列background
3 計算最優值void
c[i][j]:存儲xi,yj的最長公共子序列長度
b[i][j]:記錄c[i][j]的值是由哪個子問題的解獲得的
void LCSLength(int m,int n,char* x,int * * c,int * *b){ int i,j; for(i=1;i<=m;i++) c[i][0] = 0; for(i=1;i<=m;i++) c[o][i] = 0; for(i=1;i<=m;i++) for(j=1;j<=n;j++){ if(x[i] == y[j]){ c[i][j] = c[i-1][j-1]; b[i][j]=1; } else if(c[i-1][j] >=c[i][j-1]){ c[i][j] = c[i-1][j]; b[i][j] = 2; } else{ c[i][j] = c[i][j-1]; b[i][j] = 3; } } }
耗時O(mn);
4 構造最長公共子序列
b[m][n]開始:
值爲1:由xm-1,yn-1獲得
值爲2:由xm-1,yn獲得
值爲3:由xm,yn-1獲得