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; }
pain and happy in the cruel world.