感觉早些年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. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到 ...

  2. MT9M021/MT9M031总结

    MT9M021/MT9m031在低光照度下和捕捉移动场景有非常优异的表现,属于近红外摄像头, S1: Aptina's MT9M021/MT9M031 sensor is capable of a m ...

  3. ZOJ 3761 Easy billiards 月赛E DFS

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3761 题目大意:给定n个位置的小球,小球的运动方向只能是水平或者 ...

  4. Top 10 Java Debugging Tips with Eclipse

    In this tutorial we will see about debugging java applications using Eclipse. Debugging helps us to ...

  5. iScroll使用

    新公司比较喜欢用iScroll,而我对此一无所知,特此调研iScroll用法,写在这里方便查看 IScroll是移动页面上被使用的一款仿系统滚动插件. myScroll = new IScroll(& ...

  6. ckeditor_4.5.10_full上传图片功能

    1.找到image.js

  7. 平时Error记录

    The Windows Firewall on this machine is currently 1.This row already belongs to another table. DataT ...

  8. strstr和memcmp函数的实现

    #include <stdio.h> #include <stdlib.h> //malloc()函数 typedef unsigned int size_t; size_t ...

  9. [置顶] 基于视频采集卡驱动的错误修改CX26828

    基于视频采集卡驱动的错误修改CX26828 1. 设置root密码 command:sudo passwd root 2.查看系统状态 输入命令:lsmod root@ubuntu:/home/yu# ...

  10. CSU1315:全场最水题之陈兴老师与比赛

    Description 大家都知道ACM比赛罚时很重要.比如说你做A题要10分钟,B题要15分钟,如果先做A题再做B题,那么在ranking上的时间就是10 + (10)+ 15 = 35.如果先做B ...