#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i = a; i < b;++i)
using namespace std;
const int maxn = 8005;
int dp[maxn][maxn][3];
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n,k,t;
cin>>n >>k >>t;
string W;
cin>>W;
dp[0][0][0] = 1e5;
int cnt = 0;
FOR(i,0,n){
bool b = false;
if(n - t >= i){
b = true;
}
if(W[i] == '1'){
FOR(j,0,min(i + 2,n)){
if(b){
dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]);
dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]);
}
dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1);
dp[i + 1][j + 1][1] = max(dp[i + 1][j + 1][1],dp[i][j][1]);
dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1);
}
++cnt;
}
if(W[i] == '2'){
FOR(j,0,min(i + 2,n)){
if(b){
dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]);
dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]);
}
dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0],dp[i][j][0]);
dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1);
dp[i + 1][j + 1][1] = max(dp[i + 1][j + 1][1],dp[i][j][1]);
dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1);
dp[i + 1][j + 1][2] = max(dp[i + 1][j + 1][2],dp[i][j][2]);
}
++cnt;
}
if(W[i] == '3'){
FOR(j,0,min(i + 2,n)){
if(b){
dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]);
dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]);
}
dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1);
dp[i + 1][j][1] = max(dp[i + 1][j][1],dp[i][j][1]);
dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1);
}
}
}
int w1 = 0;
FOR(i,max(cnt - k,0),n + 1){
w1 = max({w1,dp[n][i][2],dp[n][i][0]});
}
if(w1 < 1e5){
cout<<-1;
}else{
cout<<w1 - 1e5;
}
}
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 | #include <bits/stdc++.h> #define FOR(i,a,b) for(int i = a; i < b;++i) using namespace std; const int maxn = 8005; int dp[maxn][maxn][3]; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n,k,t; cin>>n >>k >>t; string W; cin>>W; dp[0][0][0] = 1e5; int cnt = 0; FOR(i,0,n){ bool b = false; if(n - t >= i){ b = true; } if(W[i] == '1'){ FOR(j,0,min(i + 2,n)){ if(b){ dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]); dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]); } dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1); dp[i + 1][j + 1][1] = max(dp[i + 1][j + 1][1],dp[i][j][1]); dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1); } ++cnt; } if(W[i] == '2'){ FOR(j,0,min(i + 2,n)){ if(b){ dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]); dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]); } dp[i + 1][j + 1][0] = max(dp[i + 1][j + 1][0],dp[i][j][0]); dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1); dp[i + 1][j + 1][1] = max(dp[i + 1][j + 1][1],dp[i][j][1]); dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1); dp[i + 1][j + 1][2] = max(dp[i + 1][j + 1][2],dp[i][j][2]); } ++cnt; } if(W[i] == '3'){ FOR(j,0,min(i + 2,n)){ if(b){ dp[i + t][j][1] = max(dp[i + t][j][1],dp[i][j][0]); dp[i + t][j][2] = max(dp[i + t][j][2],dp[i][j][1]); } dp[i + 1][j][0] = max(dp[i + 1][j][0],dp[i][j][0] + 1); dp[i + 1][j][1] = max(dp[i + 1][j][1],dp[i][j][1]); dp[i + 1][j][2] = max(dp[i + 1][j][2],dp[i][j][2] + 1); } } } int w1 = 0; FOR(i,max(cnt - k,0),n + 1){ w1 = max({w1,dp[n][i][2],dp[n][i][0]}); } if(w1 < 1e5){ cout<<-1; }else{ cout<<w1 - 1e5; } } |
English