【模版】两字符串最大公共子序列
核心思想
dp精髓尽在图中,自行参悟(逃…)
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MaxSize 100010 //注意依题修改数组大小
using namespace std;
char a[MaxSize], b[MaxSize]; //原始两字符串
int dp[MaxSize][MaxSize]; //存放当前最大公共子序列长度
int MTASOM(char a[], char b[], int m, int n){
for (int i = 0; i <= m; i++) dp[i][0] = 0;
for (int i = 0; i <= n; i++) dp[0][i] = 0;
//初始化当其中一个字符串为空时最大公共子列长度为0
for (int i = 1; i <= m; i++){ //便于处理边界
for (int j = 1; j <= n; j++){
if (a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + 1; //当前末尾字符相等
else dp[i][j] = max(dp[i][j-1], dp[i-1][j]); //当前末尾字符不等
}
}
return dp[m][n]; //返回最大长度
}
int main() {
scanf("%s%s", a, b); //获取两个字符串
printf("%d\n", MTASOM(a, b, int(strlen(a)), int(strlen(b))));
//求最大公共子序列长度
return 0;
}