又踩了一个坑。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2000;
int dp[maxn][maxn];
char a[maxn];
char b[maxn];
char d[maxn];
int f[maxn][maxn];
void dfs(int m,int n)
{
cout<<m<<" "<<n<<endl;
if(m==0||n==0) return ;
if(f[m][n]==0){
dfs(m-1,n-1);printf("%c",a[m-1]);
}
else if(f[m][n]==1)
dfs(m-1,n);
else
dfs(m,n-1);
}
int main()
{
int m,n;
scanf("%s%s",a,b);
m=(int)strlen(a);
n=(int)strlen(b);
for(int i=1;i<=m;i++) dp[i][0]=0;
for(int i=1;i<=n;i++) dp[0][i]=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i-1]==b[j-1]) {dp[i][j]=dp[i-1][j-1]+1;f[i][j]=0;}//因为输入的时候是从0开始的,所以要-1来判断相不相等
else if(dp[i-1][j]>=dp[i][j-1]){
dp[i][j]=dp[i-1][j];
f[i][j]=1;
}
else{
dp[i][j]=dp[i][j-1];
f[i][j]=-1;
}
}
}
dfs(m,n);
printf("\n");
return 0;
}