题目描述
给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数N和M。
第二行包含一个长度为N的字符串,表示字符串A。
第三行包含一个长度为M的字符串,表示字符串B。
字符串均由小写字母构成。
输出格式
输出一个整数,表示最大长度。
输入样例
4 5
acbd
abedc
输入样例
3
算法:一维数组优化DP
算法思路:f[i][j] 是表示以s1[i]和s2[j]结尾的公共子序列最大长度,
当s1[i]!=s[j]时,f[i][j]=0,
当s1[i]==s2[j]时,f[i][j]=max(f[1..i-1][1…j-1]); 此时f[i][j]仅与上层有关,用m[j-1]表示max(f[1..i-1][1…j-1]);
那么就可以形成优化,最终结果就是m[n2];
C++ 代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n1,n2,m[N];
int main(){
ios::sync_with_stdio(false);
cin>>n1>>n2;
char s1[N],s2[N];
cin>>(s1+1);
cin>>(s2+1);
for(int i=1;i<=n1;++i){
int res=0,f=0;
for(int j=1;j<=n2;++j){
if(s1[i]!=s2[j]){
f=0;
m[j-1]=max(res,m[j-1]);
}else{
f=m[j-1]+1;
m[j-1]=max(res,m[j-1]);
res=max(f,res);
}
}
m[n2]=max(m[n2],res);
}
cout<<m[n2]<<endl;
}