【每日算法】基础算法——最长公共子序列(七十五)

题目内容

给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数N和M。

第二行包含一个长度为N的字符串,表示字符串A。

第三行包含一个长度为M的字符串,表示字符串B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N,M≤1000

输入样例

4 5
acbd
abedc

输出样例

3

题解

一、状态表示 f(i,j)
1、集合
所有A(1~i)与B(1~j)的公共子序列的集合
2、属性
全部子序列的最大值
二、状态计算

00:f[i-1, j-1]
01:f[i-1, j]
10:f[i, j-1]
11:if a[i]==b[j] f[i-1,j-1]+1

比较大小,可以重复,但不能遗漏。

代码

#include<iostream>

using namespace std;

const int N = 1010;

int n,m;
char a[N],b[N];
int f[N][N];

int main(){
cin >> n >> m >> 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;
}
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/02/25/【每日算法】基础算法——最长公共子序列(七十五)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号