[IOI2007]Miners 矿工配餐

link

其实就是一个比较简单的$IOI$题。简单$dp$就行,设$5$维$dp$即可

最后在滚动一下,判一下可行性即可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    return f*ans;
}
const int N=3;
int dp[N][4][4][4][4];
int val[100001],A[5];
int calc(int a,int b,int c){
    A[1]=a,A[2]=b,A[3]=c;sort(A+1,A+3+1);
    int res=(A[1]!=0);
    if(A[2]!=A[1]&&A[2]) res++;
    if(A[3]!=A[2]&&A[3]) res++;
    return res;
}
int maxn;
int cur;
int main(){
    cur=0;
    memset(dp,-1,sizeof(dp));dp[0][0][0][0][0]=0;
    int n=read();
    for(int i=1;i<=n;i++){char str=getchar();if(str=='M') val[i]=1;if(str=='F')val[i]=2;if(str=='B') val[i]=3;}
    for(int i=1;i<=n;i++){
        cur^=1;
        for(int t1=0;t1<=3;t1++)
            for(int t2=0;t2<=3;t2++)
                for(int t3=0;t3<=3;t3++)
                    for(int t4=0;t4<=3;t4++){
                        if(dp[cur^1][t1][t2][t3][t4]==-1) continue;
                        dp[cur][t2][val[i]][t3][t4]=max(dp[cur][t2][val[i]][t3][t4],dp[cur^1][t1][t2][t3][t4]+calc(t1,t2,val[i]));
                        dp[cur][t1][t2][t4][val[i]]=max(dp[cur][t1][t2][t4][val[i]],dp[cur^1][t1][t2][t3][t4]+calc(t3,t4,val[i]));
                    }
        memset(dp[cur^1],-1,sizeof(dp[cur^1]));
    }
    for(int t1=0;t1<=3;t1++)
        for(int t2=0;t2<=3;t2++)
            for(int t3=0;t3<=3;t3++)
                for(int t4=0;t4<=3;t4++) if(dp[cur][t1][t2][t3][t4]!=-1)maxn=max(maxn,dp[cur][t1][t2][t3][t4]);
    cout<<maxn;
}
View Code

 

posted @ 2018-12-08 13:57  siruiyang_sry  阅读(146)  评论(0编辑  收藏  举报