#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define ALL(x) begin(x), end(x)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define printBool(x) cout << ((x) ? "YES\n" : "NO\n")
#define printBoolR(x) {cout << ((x) ? "YES\n" : "NO\n"); return;}
inline ll nxt(){ll x;cin>>x;return x;}
#define fill_i(x) generate(ALL(x), nxt)
void testCase(int caseNr) {
int n, k, t; cin >> n >> k >> t;
k++;
string s; cin >> s;
vvvi DP(3, vvi(k, vi(n+1, -1e9)));
DP[0][0][0] = 0;
int next_t_meetings = 0;
for (int i = 0; i < t; i++) if (s[i] != '3') next_t_meetings++;
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
if (i + t <= n && j+next_t_meetings < k) {
DP[1][j+next_t_meetings][i+t] = max(DP[1][j+next_t_meetings][i+t], DP[0][j][i]);
DP[2][j+next_t_meetings][i+t] = max(DP[2][j+next_t_meetings][i+t], DP[1][j][i]);
}
if (s[i] == '1') {
for (int x = 0; x < 3; x++) {
if (j+1 != k) DP[x][j+1][i+1] = max(DP[x][j+1][i+1], DP[x][j][i]+1);
}
DP[1][j][i+1] = max(DP[1][j][i+1], DP[1][j][i]);
} else if (s[i] == '2') {
for (int x = 0; x < 3; x++) {
if (j != k-1) DP[x][j+1][i+1] = max(DP[x][j+1][i+1], DP[x][j][i]+1);
DP[x][j][i+1] = max(DP[x][j][i+1], DP[x][j][i]);
}
} else {
DP[0][j][i+1] = max(DP[0][j][i+1], DP[0][j][i]+1);
DP[1][j][i+1] = max(DP[1][j][i+1], DP[1][j][i]);
DP[2][j][i+1] = max(DP[2][j][i+1], DP[2][j][i]+1);
}
}
if (s[i] != '3') next_t_meetings--;
if (i+t < n && s[i+t] != '3') next_t_meetings++;
}
int best = -1;
for (int j = 0; j < k; j++) best = max({best, DP[0][j][n], DP[2][j][n]});
cout << best << '\n';
}
int main() {
// freopen("input", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(0);
// int T; cin >> T; for (int t = 1; t <= T; t++) testCase(t);
testCase(0);
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<vvi> vvvi; typedef vector<ll> vll; typedef vector<vll> vvll; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vii> vvii; typedef vector<bool> vb; typedef vector<vb> vvb; #define ALL(x) begin(x), end(x) #define pb push_back #define mp make_pair #define fi first #define se second #define printBool(x) cout << ((x) ? "YES\n" : "NO\n") #define printBoolR(x) {cout << ((x) ? "YES\n" : "NO\n"); return;} inline ll nxt(){ll x;cin>>x;return x;} #define fill_i(x) generate(ALL(x), nxt) void testCase(int caseNr) { int n, k, t; cin >> n >> k >> t; k++; string s; cin >> s; vvvi DP(3, vvi(k, vi(n+1, -1e9))); DP[0][0][0] = 0; int next_t_meetings = 0; for (int i = 0; i < t; i++) if (s[i] != '3') next_t_meetings++; for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { if (i + t <= n && j+next_t_meetings < k) { DP[1][j+next_t_meetings][i+t] = max(DP[1][j+next_t_meetings][i+t], DP[0][j][i]); DP[2][j+next_t_meetings][i+t] = max(DP[2][j+next_t_meetings][i+t], DP[1][j][i]); } if (s[i] == '1') { for (int x = 0; x < 3; x++) { if (j+1 != k) DP[x][j+1][i+1] = max(DP[x][j+1][i+1], DP[x][j][i]+1); } DP[1][j][i+1] = max(DP[1][j][i+1], DP[1][j][i]); } else if (s[i] == '2') { for (int x = 0; x < 3; x++) { if (j != k-1) DP[x][j+1][i+1] = max(DP[x][j+1][i+1], DP[x][j][i]+1); DP[x][j][i+1] = max(DP[x][j][i+1], DP[x][j][i]); } } else { DP[0][j][i+1] = max(DP[0][j][i+1], DP[0][j][i]+1); DP[1][j][i+1] = max(DP[1][j][i+1], DP[1][j][i]); DP[2][j][i+1] = max(DP[2][j][i+1], DP[2][j][i]+1); } } if (s[i] != '3') next_t_meetings--; if (i+t < n && s[i+t] != '3') next_t_meetings++; } int best = -1; for (int j = 0; j < k; j++) best = max({best, DP[0][j][n], DP[2][j][n]}); cout << best << '\n'; } int main() { // freopen("input", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(0); // int T; cin >> T; for (int t = 1; t <= T; t++) testCase(t); testCase(0); return 0; } |
English