//Mikolaj Tofiluk
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int MAXN=8007;
constexpr int INF=1000000000;
int dp[MAXN][MAXN][3];
int tab[MAXN];
int pref[MAXN];
int n,k,t;
void wczytanie(){
cin>>n>>k>>t;
char c;
for (int i=1;i<=n;i++){
cin>>c;
tab[i]=c-'1'+1;
pref[i]=pref[i-1];
if (tab[i]<=2) pref[i]++;
}
}
int solve(){
for (int i=0;i<=n;i++){
for (int j=0;j<=k;j++){
for (int m=0;m<3;m++){
dp[i][j][m]=-INF;
}
}
}
for (int j=0;j<=k;j++) dp[0][j][0]=0;
for (int i=1;i<=n;i++){
for (int j=0;j<=k;j++){
for (int m=0;m<3;m++){
if (tab[i]==3){//brak obowiazkow
if (m==1) dp[i][j][m]=dp[i-1][j][m];
else dp[i][j][m]=dp[i-1][j][m]+1;
}
else if (tab[i]==2){//zdalne spotkanie
dp[i][j][m]=dp[i-1][j][m];
if (m!=1 && j>0) dp[i][j][m]=max(dp[i][j][m],dp[i-1][j-1][m]+1);
}
else if (tab[i]==1){//spotkanie w biurze
if (m==1) dp[i][j][m]=dp[i-1][j][m];
else if (j>0) dp[i][j][m]=dp[i-1][j-1][m]+1;
}
if (i>=t && j>=(pref[i]-pref[i-t]) && m>0){
dp[i][j][m]=max(dp[i][j][m],dp[i-t][j-(pref[i]-pref[i-t])][m-1]);
}
}
}
for (int j=1;j<=k;j++){
for (int m=0;m<3;m++){
dp[i][j][m]=max(dp[i][j][m],dp[i][j-1][m]);
}
}
}
int w=max(-1,max(dp[n][k][0],dp[n][k][2]));
return w;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
wczytanie();
cout<<solve();
}
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 | //Mikolaj Tofiluk #include <bits/stdc++.h> using namespace std; using ll=long long; constexpr int MAXN=8007; constexpr int INF=1000000000; int dp[MAXN][MAXN][3]; int tab[MAXN]; int pref[MAXN]; int n,k,t; void wczytanie(){ cin>>n>>k>>t; char c; for (int i=1;i<=n;i++){ cin>>c; tab[i]=c-'1'+1; pref[i]=pref[i-1]; if (tab[i]<=2) pref[i]++; } } int solve(){ for (int i=0;i<=n;i++){ for (int j=0;j<=k;j++){ for (int m=0;m<3;m++){ dp[i][j][m]=-INF; } } } for (int j=0;j<=k;j++) dp[0][j][0]=0; for (int i=1;i<=n;i++){ for (int j=0;j<=k;j++){ for (int m=0;m<3;m++){ if (tab[i]==3){//brak obowiazkow if (m==1) dp[i][j][m]=dp[i-1][j][m]; else dp[i][j][m]=dp[i-1][j][m]+1; } else if (tab[i]==2){//zdalne spotkanie dp[i][j][m]=dp[i-1][j][m]; if (m!=1 && j>0) dp[i][j][m]=max(dp[i][j][m],dp[i-1][j-1][m]+1); } else if (tab[i]==1){//spotkanie w biurze if (m==1) dp[i][j][m]=dp[i-1][j][m]; else if (j>0) dp[i][j][m]=dp[i-1][j-1][m]+1; } if (i>=t && j>=(pref[i]-pref[i-t]) && m>0){ dp[i][j][m]=max(dp[i][j][m],dp[i-t][j-(pref[i]-pref[i-t])][m-1]); } } } for (int j=1;j<=k;j++){ for (int m=0;m<3;m++){ dp[i][j][m]=max(dp[i][j][m],dp[i][j-1][m]); } } } int w=max(-1,max(dp[n][k][0],dp[n][k][2])); return w; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); wczytanie(); cout<<solve(); } |
English