rt,第一个点爆了
自己第一遍是错解,然后根据题解重构,结果第一个点爆了卡在91分(
调了快两天了还没看出来(
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500 + 10,maxk = 100 + 10,minf = -0x3f3f3f3f;
int n,kk,dp[maxn][maxk][maxk][2],dig[maxn],ans = 0;
char str[maxn] = "";
long long read(){
long long f=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){f=f*10+(long long)(ch-'0');ch=getchar();}
return w*f;
}
int main(){
n = read(),kk = read();
scanf("%s",str);
for(int i = 1; i <= n; i++)
dig[i] = str[i - 1] == 'z';
for(int i = 1; i <= n; i++)
printf("%d",dig[i]);
puts("");
if(kk != 1){
for(int i = 0; i < n; i++)
for(int j = 0; j < kk; j++)
for(int k = 0; k < kk; k++)
dp[i][j][k][0] = dp[i][j][k][1] = minf;
dp[0][0][0][1] = 0;
};
for(int i = 1; i <= n; i++){
for(int j = 0; j <= kk; j++){
for(int k = 0; k <= kk; k++){
dp[i][j][k][dig[i]] = max(dp[i - 1][j][k][0] + dig[i],dp[i - 1][j][k][1]);
if(dig[i]){
if(k)
dp[i][j][k][0] = max(dp[i - 1][j][k - 1][0],dp[i - 1][j][k - 1][1]);
}
else{
if(j)
dp[i][j][k][1] = max(dp[i - 1][j - 1][k][0] + 1,dp[i - 1][j - 1][k][1]);
}
}
}
}
for(int i = 0; i <= kk; i++)
ans = max(ans,max(dp[n][i][i][0],dp[n][i][i][1]));
printf("%d",ans);
return 0;
}