#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k, t;
cin >> n >> k >> t;
string s;
cin >> s;
vector<int> czyn(n);
for (int i = 0; i < n; ++i) {
czyn[i] = s[i] - '0';
}
vector<int> prefix(n + 1, 0);
for (int i = 0; i < n; ++i) {
prefix[i + 1] = prefix[i] + ((czyn[i] == 1 || czyn[i] == 2) ? 1 : 0);
}
vector<vector<int>> dpdom(k + 1, vector<int>(n + 1, -1));
vector<vector<int>> dpbi(k + 1, vector<int>(n + 1, -1));
dpdom[0][0] = 0;
for (int j = 0; j < n; ++j) {
for (int i = 0; i <= k; ++i) {
if (dpdom[i][j] != -1) {
int current = dpdom[i][j];
int cat = czyn[j];
if (cat == 1) {
if (i < k) {
dpdom[i + 1][j + 1] = max(dpdom[i + 1][j + 1], current);
}
} else if (cat == 2) {
dpdom[i][j + 1] = max(dpdom[i][j + 1], current);
if (i < k) {
dpdom[i + 1][j + 1] = max(dpdom[i + 1][j + 1], current + 1);
}
} else {
dpdom[i][j + 1] = max(dpdom[i][j + 1], current + 1);
}
if (j + t <= n) {
int a = j;
int b = j + t;
int sum_miss = prefix[b] - prefix[a];
if (i + sum_miss <= k) {
int ni = i + sum_miss;
dpbi[ni][b] = max(dpbi[ni][b], current);
}
}
}
if (dpbi[i][j] != -1) {
int current = dpbi[i][j];
int cat = czyn[j];
dpbi[i][j + 1] = max(dpbi[i][j + 1], current);
if (j + t <= n) {
int a = j;
int b = j + t;
int sum_miss = prefix[b] - prefix[a];
if (i + sum_miss <= k) {
int ni = i + sum_miss;
dpdom[ni][b] = max(dpdom[ni][b], current);
}
}
}
}
}
int result = -1;
for (int i = 0; i <= k; ++i) {
result = max(result, dpdom[i][n]);
result = max(result, dpbi[i][n]);
}
cout << (result == -1 ? -1 : result) << endl;
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; int main() { int n, k, t; cin >> n >> k >> t; string s; cin >> s; vector<int> czyn(n); for (int i = 0; i < n; ++i) { czyn[i] = s[i] - '0'; } vector<int> prefix(n + 1, 0); for (int i = 0; i < n; ++i) { prefix[i + 1] = prefix[i] + ((czyn[i] == 1 || czyn[i] == 2) ? 1 : 0); } vector<vector<int>> dpdom(k + 1, vector<int>(n + 1, -1)); vector<vector<int>> dpbi(k + 1, vector<int>(n + 1, -1)); dpdom[0][0] = 0; for (int j = 0; j < n; ++j) { for (int i = 0; i <= k; ++i) { if (dpdom[i][j] != -1) { int current = dpdom[i][j]; int cat = czyn[j]; if (cat == 1) { if (i < k) { dpdom[i + 1][j + 1] = max(dpdom[i + 1][j + 1], current); } } else if (cat == 2) { dpdom[i][j + 1] = max(dpdom[i][j + 1], current); if (i < k) { dpdom[i + 1][j + 1] = max(dpdom[i + 1][j + 1], current + 1); } } else { dpdom[i][j + 1] = max(dpdom[i][j + 1], current + 1); } if (j + t <= n) { int a = j; int b = j + t; int sum_miss = prefix[b] - prefix[a]; if (i + sum_miss <= k) { int ni = i + sum_miss; dpbi[ni][b] = max(dpbi[ni][b], current); } } } if (dpbi[i][j] != -1) { int current = dpbi[i][j]; int cat = czyn[j]; dpbi[i][j + 1] = max(dpbi[i][j + 1], current); if (j + t <= n) { int a = j; int b = j + t; int sum_miss = prefix[b] - prefix[a]; if (i + sum_miss <= k) { int ni = i + sum_miss; dpdom[ni][b] = max(dpdom[ni][b], current); } } } } } int result = -1; for (int i = 0; i <= k; ++i) { result = max(result, dpdom[i][n]); result = max(result, dpbi[i][n]); } cout << (result == -1 ? -1 : result) << endl; return 0; } |
English