bzoj1806: [Ioi2007]Miners 矿工配餐

开4维记录两个坑最近两次送了啥就好

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

char ss[110000];
int a[110000],f[2][5][5][5][5];
int calc(int x,int y,int z)
{
    int ret=(x!=0);
    if(y!=x&&y!=0)ret++;
    if(z!=y&&z!=x&&z!=0)ret++;
    return ret;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    int n,now=1;
    scanf("%d%s",&n,ss+1);
    memset(f[now],-1,sizeof(f[now]));f[now][0][0][0][0]=0;
    for(int t=1;t<=n;t++)
    {
        int d;
             if(ss[t]=='M')d=1;
        else if(ss[t]=='F')d=2;
        else if(ss[t]=='B')d=3;
        
        now^=1;
        memset(f[now],-1,sizeof(f[now]));
        for(int i=0;i<=3;i++)
            for(int j=0;j<=3;j++)
                for(int u=0;u<=3;u++)
                    for(int v=0;v<=3;v++)
                        if(f[now^1][i][j][u][v]!=-1)
                            f[now][j][d][u][v]=max(f[now][j][d][u][v],f[now^1][i][j][u][v]+calc(i,j,d)),
                            f[now][i][j][v][d]=max(f[now][i][j][v][d],f[now^1][i][j][u][v]+calc(u,v,d));
    }
    int ans=0;
    for(int i=0;i<=3;i++)
        for(int j=0;j<=3;j++)
            for(int u=0;u<=3;u++)
                for(int v=0;v<=3;v++)
                    ans=max(ans,f[now][i][j][u][v]);
    printf("%d\n",ans);
    
    return 0;
}

 

posted @ 2018-10-24 19:27  AKCqhzdy  阅读(123)  评论(0编辑  收藏  举报