题目链接
题面
思路
- 定义 f i j f_{ij} fij 为第一个字符串用前 i i i 个字符,第二个字符串用前 j j j 个字符 时的最长公共子序列长度
- 如果第 i i i 个字符和第 j j j 个字符相等 f i j = f ( i − 1 ) ( j − 1 ) + 1 f_{ij} = f_{(i - 1)(j - 1)} + 1 fij=f(i−1)(j−1)+1
- 如果不相等 f i j = m a x ( f ( i − 1 ) j , f i ( j − 1 ) ) f_{ij} = max (f_{(i - 1)j}, f_{i(j - 1)}) fij=max(f(i−1)j,fi(j−1)),因为两个字符不相等加上是子序列,上下两个只能取一个,因为是子序列,所以不能都取
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int f[N][N];
char s1[N], s2[N];
int main()
{
int n, m;
cin >> n >> m;
scanf("%s %s", s1 + 1, s2 + 1);
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
if (s1[i] == s2[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;
}
总结
需要多多领悟其精髓