最长公共子序列模版
来源:互联网 发布:大数据可视化解决方案 编辑:程序博客网 时间:2024/05/16 17:01
#include<iostream>#include<string.h>#define maxn 100using namespace std;void fun(char *A,int m,char *B,int n,int a[][maxn],int b[][maxn]){ for(int i=0;i<=m;i++) a[i][0]=0; for(int i=0;i<=n;i++) a[0][i]=0; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(A[i-1]==B[j-1]) { a[i][j]=a[i-1][j-1]+1; b[i][j]=0; } else if(a[i-1][j]>a[i][j-1]) { a[i][j]=a[i-1][j]; b[i][j]=1; //行增加,为1 } else { a[i][j]=a[i][j-1]; b[i][j]=-1; //列增加,为-1 } } }}void print(char *A,int m,char *B,int n,int b[][maxn]){ if(m==0||n==0) return ; else if(b[m][n]==0) { print(A,m-1,B,n-1,b); cout<<A[m-1]; } else if(b[m][n]==1) { print(A,m-1,B,n,b); } else { print(A,m,B,n-1,b); }}int main(){ char A[maxn],B[maxn]; int a[maxn][maxn]; //记录每个状态的最大字串长 int b[maxn][maxn]; //记录前驱 int m,n; cin>>A>>B; m=strlen(A),n=strlen(B); fun(A,m,B,n,a,b); cout<<a[m][n]<<endl; print(A,m,B,n,b);return 0;}