#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define L long long
#define MP make_pair
#define REP(i, n) for(int i = 0; i < n; ++i)
#define REPR(i, n) for(int i = n - 1; i >= 0; --i)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define FORR(i, a, b) for(int i = b - 1; i >= a; --i)
#define EB emplace_back
#define ST first
#define ND second
#define S size
#define RS resize
template<class T> using P = pair<T, T>;
template<class T> using V = vector<T>;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k, t;
string s;
cin >> n >> k >> t >> s;
V<int> h(n + 2);
REP(i, n) {
h[i + 1] = int(s[i] - '0');
}
h[n + 1] = 3;
V<int> pref(n + 2, 0);
FOR(i, 1, n + 2) {
pref[i] = pref[i - 1] + (h[i] != 3);
}
int inf = int(1e9);
int dp[3][n + 2][k + 1];
REP(p, 3) {
REP(i, n + 2) {
REP(j, k + 1) {
dp[p][i][j] = -inf;
}
}
}
dp[0][0][0] = 0;
FOR(i, 1, n + 2) {
if (h[i] == 2) {
dp[0][i][0] = dp[0][i - 1][0];
} else if (h[i] == 3) {
dp[0][i][0] = dp[0][i - 1][0] + 1;
}
FOR(j, 1, k + 1) {
if (h[i] == 1) {
dp[0][i][j] = dp[0][i - 1][j - 1] + 1;
} else if (h[i] == 2) {
dp[0][i][j] = max(dp[0][i - 1][j], dp[0][i - 1][j - 1] + 1);
} else {
dp[0][i][j] = dp[0][i - 1][j] + 1;
}
}
REP(j, k + 1) {
dp[1][i][j] = dp[1][i - 1][j];
if (i > t && pref[i - 1] - pref[i - 1 - t] <= j) {
int d = pref[i - 1] - pref[i - 1 - t];
dp[1][i][j] = max(dp[1][i][j], dp[0][i - 1 - t][j - d]);
}
}
REP(j, k + 1) {
int r1 = -inf, r2 = -inf;
if (i > t && pref[i - 1] - pref[i - 1 - t] <= j) {
int d = pref[i - 1] - pref[i - 1 - t];
r2 = dp[1][i - 1 - t][j - d];
}
if (i > t && pref[i - 1] - pref[i - 1 - t] <= j - 1) {
int d = pref[i - 1] - pref[i - 1 - t];
r1 = dp[1][i - 1 - t][j - d - 1];
}
int z = j == 0 ? -inf : dp[2][i - 1][j - 1];
if (h[i] == 1) {
dp[2][i][j] = max(r1, z) + 1;
} else if (h[i] == 2) {
int m1 = max(r1, z) + 1;
int m2 = max(r2, dp[2][i - 1][j]);
dp[2][i][j] = max(m1, m2);
} else {
dp[2][i][j] = max(r2, dp[2][i - 1][j]) + 1;
}
}
}
int res = 0;
REP(j, k + 1) {
res = max(res, dp[0][n + 1][j]);
res = max(res, dp[2][n + 1][j]);
}
cout << res - 1 << '\n';
}
// g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG pra.cpp -o pra
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k, t; string s; cin >> n >> k >> t >> s; V<int> h(n + 2); REP(i, n) { h[i + 1] = int(s[i] - '0'); } h[n + 1] = 3; V<int> pref(n + 2, 0); FOR(i, 1, n + 2) { pref[i] = pref[i - 1] + (h[i] != 3); } int inf = int(1e9); int dp[3][n + 2][k + 1]; REP(p, 3) { REP(i, n + 2) { REP(j, k + 1) { dp[p][i][j] = -inf; } } } dp[0][0][0] = 0; FOR(i, 1, n + 2) { if (h[i] == 2) { dp[0][i][0] = dp[0][i - 1][0]; } else if (h[i] == 3) { dp[0][i][0] = dp[0][i - 1][0] + 1; } FOR(j, 1, k + 1) { if (h[i] == 1) { dp[0][i][j] = dp[0][i - 1][j - 1] + 1; } else if (h[i] == 2) { dp[0][i][j] = max(dp[0][i - 1][j], dp[0][i - 1][j - 1] + 1); } else { dp[0][i][j] = dp[0][i - 1][j] + 1; } } REP(j, k + 1) { dp[1][i][j] = dp[1][i - 1][j]; if (i > t && pref[i - 1] - pref[i - 1 - t] <= j) { int d = pref[i - 1] - pref[i - 1 - t]; dp[1][i][j] = max(dp[1][i][j], dp[0][i - 1 - t][j - d]); } } REP(j, k + 1) { int r1 = -inf, r2 = -inf; if (i > t && pref[i - 1] - pref[i - 1 - t] <= j) { int d = pref[i - 1] - pref[i - 1 - t]; r2 = dp[1][i - 1 - t][j - d]; } if (i > t && pref[i - 1] - pref[i - 1 - t] <= j - 1) { int d = pref[i - 1] - pref[i - 1 - t]; r1 = dp[1][i - 1 - t][j - d - 1]; } int z = j == 0 ? -inf : dp[2][i - 1][j - 1]; if (h[i] == 1) { dp[2][i][j] = max(r1, z) + 1; } else if (h[i] == 2) { int m1 = max(r1, z) + 1; int m2 = max(r2, dp[2][i - 1][j]); dp[2][i][j] = max(m1, m2); } else { dp[2][i][j] = max(r2, dp[2][i - 1][j]) + 1; } } } int res = 0; REP(j, k + 1) { res = max(res, dp[0][n + 1][j]); res = max(res, dp[2][n + 1][j]); } cout << res - 1 << '\n'; } // g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG pra.cpp -o pra |
English