动规模板 最长公共子序列
上代码:
//最长公共子序列 LCS
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1005;
int n, m, dp[N][N];
char a[N], b[N];
int main() {
cin >> a + 1 >> b + 1; //从1开始输入
n = strlen(a + 1), m = strlen(b + 1);
/*
状态设置
dp[i][j] : a[1 ~ i] 与 b[1 ~ j] 能得到的最长公共子序列的长度
状态转移
dp[i][j]
if (a[i] == b[j])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
初始化
dp[i][0] = dp[0][i] = 0
递推顺序
i : 1 ~ n
j : 1 ~ m
输出
cout << dp[n][m];
*/
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
if (a[i] == b[j])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
cout << dp[n][m];
return 0;
}
原题链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
代码可以拿走,把赞留下吧