D. Catching Cheaters |
---|
题意: 给你两个字符串A , B,他们的子串分别是C , D ,求 4 ⋅ L C S ( C , D ) − ∣ C ∣ − ∣ D ∣ 4 ⋅ L C S ( C , D ) − ∣ C ∣ − ∣ D ∣ 4⋅LCS(C,D)−∣C∣−∣D∣的最大值, L C S ( C , D ) L C S ( C , D ) LCS(C,D) 表示C , D最长公共子序列的长度。
题解: LCS基础上的一点简单变形。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _for(i, a, b) for(int i = (a); i <= (b); ++i)
const int N = 5e3 + 10;
int n, m, ans;
int dp[N][N];
char a[N], b[N];
int main() {
scanf("%d%d", &n, &m);
scanf("%s%s", a + 1, b + 1);
_for(i, 1, n) _for(j, 1, m) {
dp[i][j] = max(dp[i][j], max(dp[i - 1][j] - 1, dp[i][j - 1] - 1));
if(a[i] == b[j]) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 2);
ans = max(ans, dp[i][j]);
}
printf("%d\n", ans);
return 0;
}