细节
-
操作只含当前行和上一行,可以用滚动数组
-
下标出现减一,读入从一开始
-
f[i][j] 表示长度为i的字符串astr,和长为j的字符串bstr所有的公共子串中的最大长度
逻辑见注释
#include<iostream>
using namespace std;
#define fone(i,n) for(int i=1;i<=n;++i)
const int N=1004;
int n,m;
int f[2][N];
char a[N],b[N];
int main(){
cin>>n>>m;
scanf("%s\n%s",a+1,b+1);
int now=1,pre=0;//模式
fone(i,n){
fone(j,m){
//假定末尾不同,取某串减一中的较大值
f[now][j]=max(f[now][j-1],f[pre][j]);
//末尾相同,各自减一,取出这个长度一
if(a[i]==b[j]) f[now][j]=max(f[now][j],f[pre][j-1]+1);
}
swap(now,pre);//模式
}
cout<<f[pre][m]<<endl;
return 0;
}