感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了

状态用dp[n][a1][b1][a2][b2]表示

n表示处理到前n个餐车

第一组矿工得到的最近一种食物用a1表示,a1的上一种食物用b1表示,第二组矿工的用a2和b2表示

a和b的取值范围为[0,3],0表示没有食物,1~3分别表示三种食物中的一种

第一维可以用滚动数组优化空间

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 ;

 ][][][][];
 //none=0,bread=1,meat=2,fish=3
 int N;
 char seq[maxN];
 int s[maxN];

 inline int code(char x)
 {
     switch(x)
     {
     ;
     ;
     ;
     }
     ; //unused
 }

 void input()
 {
     scanf("%d",&N);
     scanf("%s",seq);
     ;i<N;i++) s[i]=code(seq[i]);
 }

 inline int val(int cur,int last1,int last2)
 {
     ) :;
     :;
     :;
 }

 int solve()
 {
     memset(dp[],]));
     dp[][s[]][][][]=dp[][][][s[]][]=;
     ;i<N;i++)
     {
         int& v=s[i];
         memset(dp[],]));
         ;a1<;a1++)
         {
             if(!a1) { //b1=0
                 ;a2<;a2++)
                     ;b2<;b2++) {
                         dp[][v][][a2][b2]=std::max
                                 (dp[][v][][a2][b2],
                                 dp[][][][a2][b2]+);
                         dp[][][][v][a2]=std::max
                                 (dp[][][][v][a2],
                                 dp[][][][a2][b2]+val(v,a2,b2));
                     }
             }
             ;b1<;b1++)
                 ;a2<;a2++)
                 {
                     if(!a2) {
                         dp[][a1][b1][v][]=std::max
                                 (dp[][a1][b1][v][],
                                 dp[][a1][b1][][]+);
                         dp[][v][a1][][]=std::max
                                 (dp[][v][a1][][],
                                 dp[][a1][b1][][]+val(v,a1,b1));
                     }
                     ;b2<;b2++) {
                         dp[][v][a1][a2][b2]=std::max
                                 (dp[][v][a1][a2][b2],
                                  dp[][a1][b1][a2][b2]+val(v,a1,b1));
                         dp[][a1][b1][v][a2]=std::max
                                 (dp[][a1][b1][v][a2],
                                  dp[][a1][b1][a2][b2]+val(v,a2,b2));
                     }
                 }
         }
         memcpy(dp[],dp[],]));
     }
     ;
     ;a1<;a1++)
         ;b1<;b1++)
             ;a2<;a2++)
                 ;b2<;b2++)
                     ans=std::max(ans,dp[][a1][b1][a2][b2]);
     return ans;
 }

 int main()
 {
     input();
     printf("%d\n",solve());
     ;
 }

Vijos1386 IOI2007 矿工配餐 动态规划的更多相关文章

  1. BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划

    题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一 ...

  2. [IOI2007]矿工配餐

    状态是f[i][a][b][c][d]表示第i个餐车,1号矿洞最近两顿是a,b,2号矿洞最近两顿是c,d. 给的空间是16MB,滚动数组滚动了第一维就行了 (给的变量是char是因为这个不超过256, ...

  3. [Ioi2007]Miners 矿工配餐(BZOJ1806)

    [Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两 ...

  4. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )

    dp... ------------------------------------------------------------------------------- #include<cs ...

  5. bzoj1806 [Ioi2007]Miners矿工配餐

    [bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...

  6. [bzoj1806] [ioi2007]Miners 矿工配餐

    相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...

  7. [IOI2007 D1T1]Miners 矿工配餐

    题目大意:有$2$个煤矿,$n$天.每天给一个煤矿送餐(共有有$3$种餐),价值为它与前面两次送餐(如果有的话)不同的种类数.最大化价值. 题解:看到只有三种餐,考虑状压$DP$.$f_{i,j,k, ...

  8. BZOJ 1806: [Ioi2007]Miners 矿工配餐

    ime Limit: 10 Sec  Memory Limit: 64 MBSubmit: 910  Solved: 559[Submit][Status][Discuss] Description ...

  9. bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...

随机推荐

  1. [转]Android推送方案分析(MQTT/XMPP/GCM)

    资源描述: 方案1. 使用GCM服务(Google Cloud Messaging)简介:Google推出的云消息服务,即第二代的G2DM.优点:Google提供的服务.原生.简单,无需实现和部署服务 ...

  2. 【转】蓝牙物理链路类型:SCO和ACL链路

    原文网址:http://blog.chinaunix.net/uid-23193900-id-3272233.html  蓝牙物理链路ACL(Asynchronous Connectionless), ...

  3. P1082丛林探险

    P1082丛林探险 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险. ...

  4. lost connection to mysql server reading initial communication packet

  5. 29. Divide Two Integers

    用加减法模拟除法. 除法本质就是 被除数 - 商个除数相加 = 0 如果你电脑足够好,可以无限减..但是这个题肯定不是这么简单. 最快的方法还是 减去 商乘以除数. 但是这里不能使用乘法,那只好用BI ...

  6. CAS学习笔记(三)—— SERVER登录后用户信息的返回

    一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户信息吧,不然客户端是怎么知道登录的是哪个用户.那么客户端要怎么获取用户信息呢? 其实验证成 ...

  7. iOS开发雕虫小技之傻瓜式定位神器-超简单方式解决iOS后台定时定位

    1.概述 由于公司一款产品的需求,最近一直在研究iOS设备的后台定位.主要的难点就是,当系统进入后台之后,程序会被挂起,届时定时器.以及代码都不会Run~ 所以一旦用户将我的App先换到了后台,我的定 ...

  8. 如何优化cocos2d程序的内存使用和程序大小:第二部分_(转)

    减少你的程序的大小 把纹理的颜色位深度减少到16位,不仅可以减少内存压力,还可以有效地减少程序的体积.但是,我们还有其它方法可以更进一步地减少程序的大小. TexturePacker PNG 图片优化 ...

  9. hdu 4911 Inversion(归并排序求逆序对数)2014多校训练第5场

    Inversion                                                                             Time Limit: 20 ...

  10. js 解析 bytearray 成 字符串

    function bin2String(array) { return String.fromCharCode.apply(String, array); } var bit=[104,101,108 ...