AcWing 897. 基础课二刷之第55题加强巩固 最长公共子序列*
原题链接
简单
作者:
Snow_raw
,
2021-08-20 19:00:56
,
所有人可见
,
阅读 145
题目描述
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数 N 和 M。
第二行包含一个长度为 N 的字符串,表示字符串 A。
第三行包含一个长度为 M 的字符串,表示字符串 B。
字符串均由小写字母构成。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N,M≤1000
样例
4 5
acbd
abedc
输出
3
算法
线性dp
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N],b[N];
int f[N][N];
int main(){
int n,m;
cin>>n>>m;
cin>>a+1>>b+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i]==b[j])f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
cout<<f[n][m]<<endl;
return 0;
}
总结
可以理解为四种情况a[i]和b[j]
1:相等
2:不相等,a[i]和bx匹配x在j之前
3:不相等,b[j]和ax匹配x在i之前
4:不相等,两数都没有匹配
f[i][j]=max(f[i-1][j],f[i][j-1])包含了2,3,4
转移过来的就是前面状态的最大值