最长公共子序列
#include<iostream>
using namespace std;
#define N 100
int lcslength(int x[],int y[],int m,int n,int a[][N],int b[][N])
{
for(int i=0;i<=m;i++) //把0设置为边界值
a[i][0]=0;
for(int j=0;j<=n;j++)
a[0][j]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(x[i]==y[j]) //相等则加一
{
a[i][j]=a[i-1][j-1]+1;
b[i][j]=1;
}
else if(a[i-1][j]>=a[i][j-1]) //不相等则找到最长的匹配
{
a[i][j]=a[i-1][j];
b[i][j]=2;
}
else
{
a[i][j]=a[i][j-1];
b[i][j]=3;
}
}
}
return a[m][n];
}
void lcsprint(int m,int n,int x[],int b[][N]) //打印最长公共子序
{
if(m==0 || n==0)
return;
if(b[m][n] == 1)
{
lcsprint(m-1,n-1,x,b);
cout << x[m];
}
else if(b[m][n] == 2)
lcsprint(m-1,n,x,b);
else
lcsprint(m,n-1,x,b);
}
int main()
{
int x[N],y[N],a[N][N],b[N][N];
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++)
cin>>x[i];
for(int j=1;j<=n;j++)
cin>>y[j];
cout<<lcslength(x,y,m,n,a,b)<<endl;
cout<<"最长子序列为:";
lcsprint(m,n,x,b);
return 0;
}