CF #683 (Div. 2)D. Catching Cheaters【最長公共子序列LCS變形】

lllllan.發表於2020-11-19
D. Catching Cheaters

題意: 給你兩個字串A , B,他們的子串分別是C , D ,求 4 ⋅ L C S ( C , D ) − ∣ C ∣ − ∣ D ∣ 4 ⋅ L C S ( C , D ) − ∣ C ∣ − ∣ D ∣ 4LCS(C,D)CD的最大值, 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;
}

相關文章