基本算法
如上
#include <iostream>
using namespace std;
string a,b;
int c[1010][1010] = {0};//记忆化最长度
int step[1010][1010] = {0};//记忆最长来源
int main()
{
cin>>a>>b;
a = '1' + a;
b = '1' + b;
for(int i = 1; i < b.length() ; i++)
{
for(int j = 1; j < a.length(); j++)
{
if(b[i] == a[j])
{
c[i][j] = c[i - 1][j - 1] + 1;
step[i][j] = 1;
}
else
{
if(c[i][j - 1] > c[i - 1][j])
{
c[i][j] = c[i][j - 1];
step[i][j] = 2;//左
}
else
{
c[i][j] = c[i - 1][j];
step[i][j] = 3;//上
}
}
}
}
/*for(int i = 0 ; i < b.length() + 1; i++)
{
for(int j = 0; j < a.length() + 1; j++)
{
cout<<step[i][j]<<' ';
}
cout<<endl<<endl;
}*/
int x = b.length() - 1,y = a.length() - 1,flag = 0;
char ans[1010];
while(x != 0 && y != 0)
{
//cout<<x<<' '<<y<<endl;
if(step[x][y] == 1)
{
ans[flag++] = b[x];
//cout<<b[x]<<endl;
x--;
y--;
}
else if( step[x][y] == 2)
{
y--;
}
else if( step[x][y] == 3)
{
x--;
}
}
for(int i = flag - 1; i >= 0; i--)
{
cout<<ans[i];
}
cout<<endl;
return 0;
}