【BZOJ】1806: [Ioi2007]Miners 矿工配餐-DP

dp傻x题
代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,ans,f[2][4][4][4][4];
int rv[305];char s[N];

inline void itia(int o)
{
   int i,j,k,t;
    for(i=0;i<=3;++i)
     for(j=0;j<=3;++j)
      for(k=0;k<=3;++k)
       for(t=0;t<=3;++t)
      f[o][i][j][k][t]=-1;
    f[o][0][0][0][0]=0;
}

int main(){
    int q=0,p,i,j,k,t,now,x,y,ret;
    scanf("%d%s",&n,s);itia(1);
    rv[(int)'M']=1;rv[(int)'F']=2;rv[(int)'B']=3;
    for(p=0;p<n;++p,q^=1){
        now=rv[s[p]];itia(q);
        for(i=0;i<=3;++i)for(j=0;j<=3;++j) for(k=0;k<=3;++k)for(t=0;t<=3;++t)
            if(f[q^1][i][j][k][t]!=-1){
                x=y=1;ret=f[q^1][i][j][k][t];
                if(j && j!=now) x++;
                if(j && i && i!=now && i!=j) x++;
                f[q][j][now][k][t]=max(f[q][j][now][k][t],ret+x);
                if(t && t!=now) y++;
                if(k && t && k!=now && k!=t) y++;
                f[q][i][j][t][now]=max(f[q][i][j][t][now],ret+y);
            }
    }q^=1;
    for(i=0;i<=3;++i) 
     for(j=0;j<=3;++j)
      for(k=0;k<=3;++k)
       for(t=0;t<=3;++t)
        ans=max(f[q][i][j][k][t],ans);
    printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值