算法理念:
今天讲述的这个内容的话,是不包含输出公共字符串的,所以相对而言会比较简单,就还是一个递归的思想,干就完了!
举个栗子:
a:A B C D E
b:A F B C
a[1]=b[1],子序列个数加一,A开始扫描下一个数F,不一致,就取之前A子序列个数的最大值,所以A扫描完以后,子序列的最大值仍然是1,然后B开始扫描,扫描到A时候不一致,该时候最长子序列个数为1(因为A已经被计算过了),但是当它扫描到F时,子序列仍然为1,直到它扫描到B,子序列个数再次加一,为二,以此类推我们能够得到一组状态转移方程:
经典例题:
模板题:
#include <iostream>
using namespace std;
const int N = 1100;
int n, m;
char a[N], b[N];
int f[N][N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= m; i++) {
cin >> b[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i] == b[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;
}
撒花!(输出和最长公共子字符串还没学会,学会后更新)