AcWing 897. 最长公共子序列
原题链接
简单
作者:
江见月
,
2021-04-02 23:20:43
,
所有人可见
,
阅读 254
/*
解题思路: DP O(n*m)
状态表示 :f(i,j)表示: 把字符串 a的前i个字母 和 字符串b的前j个字母 所有公共子串 的 最大长度。
状态转移:f[i][j]=max(f[i][j-1],f[i-1][j]);
f[i][j]可以从 f[i-1][j-1]、 f[i-1][j-1]+1(a[i]==b[j])、 f[i-1][j]、 f[i][j-1] 四种状态转移过来
*/
#include<bits/stdc++.h>
using namespace std;
int f[1010][1010];
char a[1011],b[1101];
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++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
cout<<f[n][m]<<endl;
return 0;
}