/*
@Time:2019-40-13
@Author:A fan of Arsenal
@Theme:最长公共子序列练习
*/
#include<iostream>
using namespace std;
int x[50],y[50];
int m,n,b[100][100],c[100][100];//m是X序列的长度 n是Y序列的长度;c[i][j]数组存储Xi和Yj的最大子序列长度;b[i][j]存储c[i][j]的值是由那个子问题得到的.
void input()
{
cout<<"请输入x序列的长度:"<<endl;
cin>>m;
cout<<"请输入x序列:"<<endl;
for(int i=1;i<=m;i++)
cin>>x[i];
cout<<"请输入y序列的长度:"<<endl;
cin>>n;
cout<<"请输入y序列:"<<endl;
for(int i=1;i<=n;i++)
cin>>y[i];
}
//最优解
void LCSlength()
{
for(int i=1;i<=m;i++)
c[i][0]=0;
for(int i=1;i<=n;i++)
c[0][i]=0;
for(int i=1;i<=m;i++)
{
for(int 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]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
}
}
//构造最优解,打印出序列
void LCS(int i,int j)
{
if(i==0 || j==0)
{
return;
}
if(b[i][j]==1)
{
LCS(i-1,j-1);
cout<<x[i];
}
else
{
if(b[i][j]==2)
{
LCS(i-1,j);
}
else
{
LCS(i,j-1);
}
}
}
int main()
{
input();
LCSlength();
LCS(m,n);
system("pause");
return 0;
}