题解:CF1409F Subsequences of Length Two
Forgetfulness · · 题解
Content
给你两个字符串
最多可以修改
Solution
首先我们注意到“子序列”,而
有了答案的快速贡献之后,我们考虑如何处理修改。
考虑记
但我们发现当
当然也有从后向前记
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 200 + 5;
int n, k;
string s, t;
long long dp[N][N][N];
int main () {
ios::sync_with_stdio (0);
cin.tie (0); cout.tie (0);
cin >> n >> k;
cin >> s >> t;
s = " " + s, t = " " + t;
// 因为比 max,初始化一个最小值。
memset (dp, -0x7f, sizeof dp);
dp[0][0][0] = 0;
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= k; ++j)
for (int l = 0; l <= n; ++l) {
if (s[i] != t[1] && s[i] != t[2]) dp[i][j][l] = dp[i - 1][j][l]; // 非 t 中元素
// s_i = t_1 时
if (s[i] != t[1] && j >= 1) dp[i][j][l] = max (dp[i][j][l], dp[i - 1][j - 1][l - 1] + (t[1] == t[2]) * (l - 1));
else if (s[i] == t[1]) dp[i][j][l] = max (dp[i][j][l], dp[i - 1][j][l - 1] + (t[1] == t[2]) * (l - 1));
// s_i = t_2 时
if (s[i] != t[2] && j >= 1) dp[i][j][l] = max (dp[i][j][l], dp[i - 1][j - 1][l] + l);
else if (s[i] == t[2]) dp[i][j][l] = max (dp[i][j][l], dp[i - 1][j][l] + l);
}
long long ans = 0;
for (int i = 0; i <= k; ++i) for (int j = 0; j <= n; ++j) ans = max (ans, dp[n][i][j]);
cout << ans;
return 0;
}