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