题目链接: https://www.51nod.com/tutorial/course.html#!courseId=4
最长公共子序列和编辑距离一样,都是先跑出 DP 二维数组,然后再往回找,最长公共子序列需要倒序输出。
这两个题,先学一个,再自己推一个,效果很好。
代码如下 :
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
char B[1005];
char A[1005];
char Path[1005];
int dp[1005][1005],n,m;
void Print()
{
int i=n;
int j=m;
int cnt=0;
while(i>0 && j>0)
{
if(A[i-1]==B[j-1])
{
Path[cnt++]=A[i-1];
i--;j--;
}
else if(dp[i-1][j]>dp[i][j-1])
i--;
else
j--;
}
for(i=cnt-1;i>=0;i--)
printf("%c",Path[i]);
printf("\n");
}
int main()
{
while(~scanf("%s%s",A,B))
{
n=strlen(A);
m=strlen(B);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(i==0 || j==0)
dp[i][j]=0;
else if(A[i-1] == B[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
Print();
}
return 0;
}