#include <iostream>
using namespace std;
int tab[8'007];
int dp[8'007][8'007][3];
int pref[8007];
int main()
{
//freopen("cash.txt","r",stdin);
ios_base::sync_with_stdio(0);
cin.tie(0);
string s;
int n, k, t, odp=-1;
cin>>n>>k>>t;
cin>>s;
for(int a=1; a<=n; a++)
tab[a-1]=s[a-1]-'0';
for(int a=1; a<=n; a++){
pref[a]=pref[a-1];
if(tab[a-1]!=3)
pref[a]++;
}
for(int a=0; a<=n; a++)
for(int i=0; i<=n*2; i++)
for(int o=0; o<3; o++)
dp[a][i][o]=-1'000'000'007;
dp[0][0][0]=0;
for(int a=0; a<n; a++){
for(int i=0; i<=k; i++){
if(a+t<=n && i+pref[a+t]-pref[a]<=k){
dp[a+t][i+pref[a+t]-pref[a]][1]=max(dp[a][i][0],dp[a+t][i+pref[a+t]-pref[a]][1]);
dp[a+t][i+pref[a+t]-pref[a]][2]=max(dp[a][i][1],dp[a+t][i+pref[a+t]-pref[a]][2]);
}
if(tab[a]==3){
dp[a+1][i][0]=max(dp[a][i][0]+1,dp[a+1][i][0]);
dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]);
dp[a+1][i][2]=max(dp[a][i][2]+1,dp[a+1][i][2]);
}
if(tab[a]!=3){
dp[a+1][i+1][0]=max(dp[a][i][0]+1,dp[a+1][i+1][0]);
dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]);
dp[a+1][i+1][2]=max(dp[a][i][2]+1,dp[a+1][i+1][2]);
}
if(tab[a]==2)
for(int o=0; o<3; o++)
dp[a+1][i][o]=max(dp[a][i][o],dp[a+1][i][o]);
if(tab[a]==1)
dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]);
}
//cout<<a<<"\n";
if(1)
continue;
for(int i=0; i<=7; i++)
cout<<dp[a][i][2]<<" ";
cout<<endl;
}
//cout<<"XD";
/*for(int i=0; i<=7; i++)
cout<<dp[n][i][2]<<" ";
cout<<endl;*/
for(int a=0; a<=k; a++)
odp=max(odp,max(dp[n][a][0],dp[n][a][2]));
cout<<odp;
}
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 | #include <iostream> using namespace std; int tab[8'007]; int dp[8'007][8'007][3]; int pref[8007]; int main() { //freopen("cash.txt","r",stdin); ios_base::sync_with_stdio(0); cin.tie(0); string s; int n, k, t, odp=-1; cin>>n>>k>>t; cin>>s; for(int a=1; a<=n; a++) tab[a-1]=s[a-1]-'0'; for(int a=1; a<=n; a++){ pref[a]=pref[a-1]; if(tab[a-1]!=3) pref[a]++; } for(int a=0; a<=n; a++) for(int i=0; i<=n*2; i++) for(int o=0; o<3; o++) dp[a][i][o]=-1'000'000'007; dp[0][0][0]=0; for(int a=0; a<n; a++){ for(int i=0; i<=k; i++){ if(a+t<=n && i+pref[a+t]-pref[a]<=k){ dp[a+t][i+pref[a+t]-pref[a]][1]=max(dp[a][i][0],dp[a+t][i+pref[a+t]-pref[a]][1]); dp[a+t][i+pref[a+t]-pref[a]][2]=max(dp[a][i][1],dp[a+t][i+pref[a+t]-pref[a]][2]); } if(tab[a]==3){ dp[a+1][i][0]=max(dp[a][i][0]+1,dp[a+1][i][0]); dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]); dp[a+1][i][2]=max(dp[a][i][2]+1,dp[a+1][i][2]); } if(tab[a]!=3){ dp[a+1][i+1][0]=max(dp[a][i][0]+1,dp[a+1][i+1][0]); dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]); dp[a+1][i+1][2]=max(dp[a][i][2]+1,dp[a+1][i+1][2]); } if(tab[a]==2) for(int o=0; o<3; o++) dp[a+1][i][o]=max(dp[a][i][o],dp[a+1][i][o]); if(tab[a]==1) dp[a+1][i][1]=max(dp[a][i][1],dp[a+1][i][1]); } //cout<<a<<"\n"; if(1) continue; for(int i=0; i<=7; i++) cout<<dp[a][i][2]<<" "; cout<<endl; } //cout<<"XD"; /*for(int i=0; i<=7; i++) cout<<dp[n][i][2]<<" "; cout<<endl;*/ for(int a=0; a<=k; a++) odp=max(odp,max(dp[n][a][0],dp[n][a][2])); cout<<odp; } |
English