先dp出最长长度,然后往前找,找到变化点。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N=1005;
int dp[N][N];
char ans[N];int pos;
int main()
{
char a[N],b[N];
gets(a+1);gets(b+1);
int l1=strlen(a+1),l2=strlen(b+1);
for(int i=1;i<=l1;i++)
for(int j=1;j<=l2;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a[i]==b[j]&&dp[i-1][j-1]+1>dp[i][j])
dp[i][j]=dp[i-1][j-1]+1;
}
int len=dp[l1][l2];
int i=l1,j=l2;pos=len-1;
while(dp[i][j])
{
if(dp[i][j]==dp[i-1][j]) i--;
else if(dp[i][j]==dp[i][j-1]) j--;
else ans[pos--]=a[i],i--,j--;
}
ans[len]='\0';
puts(ans);
}