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;
}
优质内容筛选与推荐>>
1、FLASK 部署
2、关于二分法的理解
3、sql优化
4、委托与事件(迷糊………………)
5、SQL 常用


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号