AcWing 897. 最长公共子序列
原题链接
简单
作者:
阿飞被注册了
,
2021-05-31 19:31:32
,
所有人可见
,
阅读 226
C++ 代码
//f[i][j]--即在a组前i中,又在b组前j的字母的最大数量 (最长公共子序列)
//f[i][j]状态划分:0 0 -- f[i-1][j-1] a组前i-1,b组前j-1中最长公共子序列;
// 0 1 -- f[i-1][j] a组前i-1,b组前j中最长公共子序列;
// 1 0 -- f[i][j-1] a组前i,b组前j-1中最长公共子序列;
// 1 1 -- f[i-1][j-1] + 1 a组前i,b组前j中最长公共子序列 此时包含a[i],b[j], a[i] == b[j];
//由于要取的是MAX 故 max(01, 10) == max(01 , 10, 00)
//综上:f[i][j] = max(f[i-1][j], f[i][j-1], f[i-1][j-1] + 1);
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e3+10;
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++)
{
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];
return 0;
}