動態規劃求解最長公共子序列的C++演算法實現
#include<iostream> using namespace std; int CommonOrder(char x[] ,int m ,char y[], int n, char z[]) { int i,j,k; int L[10][10],S[10][10]; for(j=0;j<=n;j++) L[0][j] = 0; for(i=0;i<=m;i++) L[i][0] = 0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(x[i-1]==y[j-1]) { L[i][j] = L[i-1][j-1]+1; //如果x[i-1]==y[j-1],那麼L[i][j]的值為其最近的左對角線元素的值加一 S[i][j] = 1; } else if(L[i][j-1]>=L[i-1][j]) //如果 L[i][j-1]>=L[i-1][j]即 L[i][j]左邊相鄰的元素大於等於上方相鄰的 { //元素,則該元素的值取左方相鄰元素的值 L[i][j] = L[i][j-1]; S[i][j] = 2; } else //如果x[i-1]==y[j-1]且L[i][j-1]<L[i-1][j],則 L[i][j]的值為其上方的值 { L[i][j] = L[i-1][j]; S[i][j] =3; } } for(j=0;j<=m;j++) { for(i=0;i<=n;i++) cout<<L[j][i]; cout<<endl; } i=m;j=n;k=L[m][n]; while(i>0 && j>0) { if(S[i][j] == 1) { z[k] = x[i]; k--; i--; j--; } else if(S[i][j] == 2) j--; else i--; } for(k=0;k<L[m][n];k++) cout<<z[k]; cout<<endl; return L[m][n]; }
int main() { char x[]={'a','b','c','b','d','b'}; char y[]={'a','c','b','b','a','b','d','b','b'}; char b[50]; cout<<"最長子序列的長度為:"<<CommonOrder(x,6,y,9,b); }