状态是f[i][a][b][c][d]表示第i个餐车,1号矿洞最近两顿是a,b,2号矿洞最近两顿是c,d。

给的空间是16MB,滚动数组滚动了第一维就行了

(给的变量是char是因为这个不超过256,但是并没有快多少

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,f[2][4][4][4][4];
char s[100005];
inline char fy(char c) {
if(c=='M') return 1;
if(c=='F') return 2;
if(c=='B') return 3;
}
inline char mei(short a,short b,short c) {
register char tp=1;
if(a!=b&&a!=c&&a) tp++;
if(b!=c&&b) tp++;
return tp;
}
int main() {
scanf("%d",&n);
scanf("%s",s+1);
memset(f,-1,sizeof f);
f[0][0][0][0][0]=0;
register int i;register char j,k,l,m,t;
for(i=1;i<=n;i++) {
for(j=0;j<4;j++)
for(k=0;k<4;k++)
for(l=0;l<4;l++)
for(m=0;m<4;m++) {
if(f[i+1&1][j][k][l][m]==-1) continue;
t=fy(s[i]);
f[i&1][k][t][l][m]=max(f[i&1][k][t][l][m],f[i+1&1][j][k][l][m]+mei(j,k,t));
f[i&1][j][k][m][t]=max(f[i&1][j][k][m][t],f[i+1&1][j][k][l][m]+mei(l,m,t));
}
memset(f[i+1&1],-1,sizeof f[0]);
}
int ans=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
for(l=0;l<4;l++)
ans=max(ans,f[n&1][i][j][k][l]);
cout<<ans<<endl;
return 0;
}

[IOI2007]矿工配餐的更多相关文章

  1. Vijos1386 IOI2007 矿工配餐 动态规划

    感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...

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

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

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

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

  4. bzoj1806 [Ioi2007]Miners矿工配餐

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

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

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

  6. [IOI2007 D1T1]Miners 矿工配餐

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

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

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

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

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

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

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

随机推荐

  1. (5)QlikView中的RowNo()函数

    函数介绍 RowNo()返回当前行的行号,在QlikView载入后的数据表中.第一行的值是1. 使用注意:此函数没有參数.可是括号不能省略. 适用范围,能够用于Load脚本,也能够用于Chart的表达 ...

  2. 解决国内android sdk无法更新,google不能的简单办法

    在国内屏蔽了很多外国站点.连google 和android都屏蔽了,做程序猿的就苦了! 只是车到山前必有路,我们也有我们的办法! 推荐一个比以下的更好的方法:红杏公益代理:http://blog.cs ...

  3. Codeforces Round #332 (Div. 2)C. Day at the Beach 树状数组

    C. Day at the Beach   One day Squidward, Spongebob and Patrick decided to go to the beach. Unfortuna ...

  4. 文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号

    单行文本溢出显示省略号 max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;   多行文本 ...

  5. ElasticSearch源码解析(五):排序(评分公式)

    ElasticSearch源码解析(五):排序(评分公式) 转载自:http://blog.csdn.net/molong1208/article/details/50623948   一.目的 一个 ...

  6. [CTSC 2008] 祭祀

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1143 [算法] 答案为最小路径可重复点覆盖所包含的路径数,将原图G进行弗洛伊德传递闭 ...

  7. 5-8 第五天 微信 JS-SDK

    SDK的难点不多,但是容易出错的地方特别多.几乎任何一个环节都会犯错误. 难道没有域名就不让你测了吗?别担心,有公众测试号, 域名这个代理呢是通过QQ浏览器的服务器调试,来绑定这个端口的,把这个服务开 ...

  8. 关于类和对象的进一步讨论之析构函数 C++

    析构函数也是一个特殊的成员函数.它的作用与构造函数相反.它的名字是在类名的前面加一个“~”符号.在C++中“~”是位取反运算符.当对象的生命结束时,会自动执行解析函数.以下几种情况会执行析构函数: 1 ...

  9. 0503 php中for与foreach的区别

    结论: foreach:只能用于数组和对象,如果是非索引数组,只可以用foreach. for:如果是索引数组,可以用for遍历. foreach循环结构是按照数组内部的指针去循环的,当 foreac ...

  10. linux下安装rabbitmq以及在spring中进行集成

    ### 一.安装erlang 1. yum install ncurses-devel 2. ./configure --prefix=/usr/local/erlang20 --without-ja ...