记录编号 532416 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [IOI 2007] 矿工配餐 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 2.303 s
提交时间 2019-05-29 14:06:28 内存使用 14.14 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std; 
const int N=1e5+7; 
int v[N],dp[2][4][4][4][4],n,now;
char s[N];
int val(int x,int y,int z)
{
    if(!x && !y) return 1;
    if(!x) return 1+(y!=z);
    if(x==y && y==z) return 1;
    return(x!=y)+(y!=z)+(x!=z);
}
int main()
{
	freopen("miners.in","r",stdin);
	freopen("miners.out","w",stdout);
	scanf("%d",&n);
	scanf("%s",s+1);
	for (int i=1;i<=n;i++)
	{
		if (s[i]=='M') v[i]=1;
		else if (s[i]=='F') v[i]=2;
		else if (s[i]=='B') v[i]=3;
	}
	memset(dp,-1,sizeof(dp)); dp[0][0][0][0][0]=0; 
	for (int i=1;i<=n;i++)
	{
		int k=v[i];
		now=i%2;
		for (int a=0;a<=3;a++)
		 for (int a1=0;a1<=3;a1++)
		  for (int b=0;b<=3;b++)
		   for (int b1=0;b1<=3;b1++)
		{
			if (dp[now^1][a][a1][b][b1]==-1) continue; 
			dp[now][k][a][b][b1]=max(dp[now][k][a][b][b1],dp[now^1][a][a1][b][b1]+val(a1,a,k));
			dp[now][a][a1][k][b]=max(dp[now][a][a1][k][b],dp[now^1][a][a1][b][b1]+val(b1,b,k)); 
		} 
	}
	int ans=0;
	for (int a=0;a<=3;a++)
	  for (int a1=0;a1<=3;a1++)
	   for (int b=0;b<=3;b++)
	     for (int b1=0;b1<=3;b1++) 
	ans=max(ans,dp[now][a][a1][b][b1]);
	printf("%d",ans); 
	return 0; 
}