最长公共子序列
前言
顾名思义:a,b串删去一些字符后得到的相同字串
模板
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int n,m;
char a[N];
char b[N];
int dp[1000][10000];
int x[N],y[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]==b[i])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[n][m];
return 0;
}
带输出
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int n,m;
char a[N];
char b[N];
int dp[1000][10000];
int x[N],y[N];
char ans[N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]==b[i])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[n][m];
int i = n, j = m;//简单的双指针
while(dp[i][j] > 0)
{
if(a[i] == b[j])
{
ans[dp[i][j]] = a[i];
i--, j--;
}
else
{
if(dp[i][j] == dp[i - 1][j]) i--;
else j--;
}
}
printf("%s", ans + 1);
return 0;
}