最长公共子序列
假设求Xi和Yi的最长公共子序列,设c[i][j]表示它俩最长公共子序列的长度。
0 i=0或j=0
c[i][j]= c[i-1][j-1]+1 i,j>0且Xi=Yi
max{c[i][j-1],c[i-1][j]} i,j>0且Xi !=Yi
#include <iostream> using namespace std; char x[1005],y[1005]; int b[1005][1005]; int c[1005][1005]; void LSClength(int m,int n){ int i,j; 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]+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]=3; }else { c[i][j]=c[i][j-1]; b[i][j]=2; } } void LSC(int i,int j){ if(i==0||j==0) return; if(b[i][j]==1){ LSC(i-1,j-1); cout<<x[i]; }else if(b[i][j]==2) LSC(i,j-1); else LSC(i-1,j); } int main(){ memset(c,0,sizeof(c)); memset(b,0,sizeof(b)); memset(x,'0',sizeof(x)); memset(y,'0',sizeof(y)); while(cin>>x>>y){ int m=strlen(x); int n=strlen(y); for(int i=m;i>0;i--) x[i]=x[i-1]; for(int j=n;j>0;j--) y[j]=y[j-1]; LSClength(m,n); LSC(m,n); } return 0; }