91求救
查看原帖
91求救
553309
Computer_Nebuilirion楼主2022/6/17 13:34

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;
}

2022/6/17 13:34
加载中...