#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
using ll = long long;
#define debug(x) #x << " = " << x << '\n'
const int NMAX = 8000;
const int H = 0;
const int W = 1;
const int INF = 1e9;
int pref[NMAX + 1][NMAX + 1];
int suff[NMAX + 1][NMAX + 1];
int sum[NMAX + 1][4];
int main() {
int n, k, t;
std::cin >> n >> k >> t;
std::string s;
std::cin >> s;
s = '$' + s;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 3; j++) {
sum[i][j] = sum[i - 1][j];
}
sum[i][s[i] - '0']++;
}
for (int i = t + 1; i <= n; i++) { // daca i e primul segment in care sunt in office
for (int j = 0; j <= n; j++) {
pref[i][j] = -INF;
}
int lose = sum[i - 1][1] + sum[i - 1][2] - sum[i - t - 1][2];
int alegere = sum[i - 1 - t][2];
int probleme = sum[i - 1 - t][3] + sum[i - 1 - t][1];
for (int j = 0; j <= alegere; j++) { // la cate meet uri remote particip
pref[i][j + lose] = probleme + j;
}
}
for (int i = t + 1; i <= n - t; i++) {
for (int j = 0; j <= n; j++) {
suff[i][j] = -INF;
}
int lose = sum[n][1] - sum[i][1] + sum[i + t][2] - sum[i][2];
int alegere = sum[n][2] - sum[i + t][2];
int probleme = sum[n][3] - sum[i + t][3] + sum[n][1] - sum[i + t][1];
for (int j = 0; j <= alegere; j++) {
suff[i][j + lose] = probleme + j;
}
}
int answer = -1;
for (int r = n - t; r > 0; r--) {
for (int cntr = 0; cntr <= n; cntr++) {
if (r < n - t) {
suff[r][cntr] = std::max(suff[r][cntr], suff[r + 1][cntr]);
}
if (cntr > 0) {
suff[r][cntr] = std::max(suff[r][cntr], suff[r][cntr - 1]);
}
}
}
for (int l = t + 1; l <= n - t; l++) {
for (int cntl = 0; cntl <= k; cntl++) {
answer = std::max(answer, pref[l][cntl] + suff[l][k - cntl]);
}
}
// daca nu merg la office
int cnt1 = std::count(s.begin() + 1, s.end(), '1');
int cnt2 = std::count(s.begin() + 1, s.end(), '2');
int cnt3 = std::count(s.begin() + 1, s.end(), '3');
// i <= k - cnt1
for (int i = 0; i <= cnt2; i++) { // la cate dau skip
if (i + cnt1 <= k) {
answer = std::max(answer, n - (cnt2 - i));
}
}
std::cout << answer;
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> #include <vector> #include <algorithm> #include <cassert> using ll = long long; #define debug(x) #x << " = " << x << '\n' const int NMAX = 8000; const int H = 0; const int W = 1; const int INF = 1e9; int pref[NMAX + 1][NMAX + 1]; int suff[NMAX + 1][NMAX + 1]; int sum[NMAX + 1][4]; int main() { int n, k, t; std::cin >> n >> k >> t; std::string s; std::cin >> s; s = '$' + s; for (int i = 1; i <= n; i++) { for (int j = 1; j <= 3; j++) { sum[i][j] = sum[i - 1][j]; } sum[i][s[i] - '0']++; } for (int i = t + 1; i <= n; i++) { // daca i e primul segment in care sunt in office for (int j = 0; j <= n; j++) { pref[i][j] = -INF; } int lose = sum[i - 1][1] + sum[i - 1][2] - sum[i - t - 1][2]; int alegere = sum[i - 1 - t][2]; int probleme = sum[i - 1 - t][3] + sum[i - 1 - t][1]; for (int j = 0; j <= alegere; j++) { // la cate meet uri remote particip pref[i][j + lose] = probleme + j; } } for (int i = t + 1; i <= n - t; i++) { for (int j = 0; j <= n; j++) { suff[i][j] = -INF; } int lose = sum[n][1] - sum[i][1] + sum[i + t][2] - sum[i][2]; int alegere = sum[n][2] - sum[i + t][2]; int probleme = sum[n][3] - sum[i + t][3] + sum[n][1] - sum[i + t][1]; for (int j = 0; j <= alegere; j++) { suff[i][j + lose] = probleme + j; } } int answer = -1; for (int r = n - t; r > 0; r--) { for (int cntr = 0; cntr <= n; cntr++) { if (r < n - t) { suff[r][cntr] = std::max(suff[r][cntr], suff[r + 1][cntr]); } if (cntr > 0) { suff[r][cntr] = std::max(suff[r][cntr], suff[r][cntr - 1]); } } } for (int l = t + 1; l <= n - t; l++) { for (int cntl = 0; cntl <= k; cntl++) { answer = std::max(answer, pref[l][cntl] + suff[l][k - cntl]); } } // daca nu merg la office int cnt1 = std::count(s.begin() + 1, s.end(), '1'); int cnt2 = std::count(s.begin() + 1, s.end(), '2'); int cnt3 = std::count(s.begin() + 1, s.end(), '3'); // i <= k - cnt1 for (int i = 0; i <= cnt2; i++) { // la cate dau skip if (i + cnt1 <= k) { answer = std::max(answer, n - (cnt2 - i)); } } std::cout << answer; return 0; } |
English