Miners 矿工配餐题解

Miners 矿工配餐题解

简单题。
空间很小,没关系,滚动数组。
其余就是裸的DP了:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int n,t,o=0,ans=0,inf,f[2][4][4][4][4];
char s[N];
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T;
}
inline int w(int a,int b,int c){
   int ret=1;
   if((a&&b&&a!=b)||(b&&c&&b!=c)||(a&&c&&a!=c)) ++ret;
   if(a&&b&&c&&a!=b&&b!=c&&a!=c) ++ret;
   return ret;
}
int main(){
   n=read(),scanf("%s",s+1),memset(f,-0x3f,sizeof(f)),inf=f[0][0][0][0][0],f[0][0][0][0][0]=0;
   for(int i=1;i<=n;++i){
       o^=1;
       if(s[i]=='M') t=1;
       else if(s[i]=='F') t=2;
       else t=3;
       for(int j=0;j<=3;++j) for(int k=0;k<=3;++k) for(int p=0;p<=3;++p) for(int q=0;q<=3;++q) f[o][j][k][p][q]=inf;
       for(int j=0;j<=3;++j) for(int k=0;k<=3;++k) for(int p=0;p<=3;++p) for(int q=0;q<=3;++q) f[o][j][k][p][t]=max(f[o][j][k][p][t],f[o^1][j][k][q][p]+w(q,p,t));
       for(int j=0;j<=3;++j) for(int k=0;k<=3;++k) for(int p=0;p<=3;++p) for(int q=0;q<=3;++q) f[o][j][t][k][p]=max(f[o][j][t][k][p],f[o^1][q][j][k][p]+w(q,j,t));
   }
   for(int j=0;j<=3;++j) for(int k=0;k<=3;++k) for(int p=0;p<=3;++p) for(int q=0;q<=3;++q) ans=max(ans,f[o][j][k][p][q]);
   printf("%d\n",ans);
   return 0;
}
posted @ 2019-11-11 18:13  lsoi_ljk123  阅读(133)  评论(0编辑  收藏  举报