[IOI2007 D1T1]Miners 矿工配餐
题目大意:有$2$个煤矿,$n$天。每天给一个煤矿送餐(共有有$3$种餐),价值为它与前面两次送餐(如果有的话)不同的种类数。最大化价值。
题解:看到只有三种餐,考虑状压$DP$。$f_{i,j,k,l,m}$表示现在是第$i$天,第一个煤矿上一次为$j$,再上一次为$k$(没有为$0$),$l,m$同理。
$$(calc(a,b,c)为求出这三个数中有多少种不为0的数)$$
$$f_{i,s_i,j,l,m} = f_{i-1,j,k,l,m} + calc(s_i,j,k)(如果f_{i-1,j,k,l,m}存在)$$
$$f_{i,j,k,s_i,l} = f_{i-1,j,k,l,m} + calc(s_i,l,m)(如果f_{i-1,j,k,l,m}存在)$$
卡点:1.加了一个假的优化
C++ Code:
#include <cstdio>
#include <cstring>
#define maxn 100010
using namespace std;
int f[2][4][4][4][4], n, s[maxn], ans;
bool v[2][4][4][4][4];
int now = 1, past = 0;
char ch[maxn];
void up(int &a, int b) {
if (b > a) a = b;
}
int tmp[4];
int calc(int a, int b, int c) {
memset(tmp, 0, sizeof tmp);
tmp[a] = tmp[b] = tmp[c] = 1;
return tmp[1] + tmp[2] + tmp[3];
}
int main() {
scanf("%d", &n);
scanf("%s", ch + 1);
for (int i = 1; i <= n; i++) s[i] = (ch[i] == 'B' ? 3 : (ch[i] == 'M' ? 1 : 2));
v[now][0][0][0][0] = true;
for (int i = 1; i <= n; i++) {
now ^= past ^= now ^= past;
memset(f[now], 0, sizeof f[now]);
memset(v[now], false, sizeof v[now]);
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
for (int l = 0; l < 4; l++) {
for (int m = 0; m < 4; m++) {
if (v[past][j][k][l][m]) {
up(f[now][s[i]][j][l][m], f[past][j][k][l][m] + calc(s[i], j, k));
up(f[now][j][k][s[i]][l], f[past][j][k][l][m] + calc(s[i], l, m));
v[now][s[i]][j][l][m] = true;
v[now][j][k][s[i]][l] = true;
}
}
}
}
}
}
for (int i = 0; i < 4; i++)
for (int j = (i != 0); j < 4; j++)
for (int k = 0; k < 4; k++)
for (int l = (k != 0); l < 4; l++) up(ans, f[now][i][j][k][l]);
printf("%d\n", ans);
return 0;
}
[IOI2007 D1T1]Miners 矿工配餐的更多相关文章
- [Ioi2007]Miners 矿工配餐(BZOJ1806)
[Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 214 Solved: 128 Description 现有两 ...
- BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )
dp... ------------------------------------------------------------------------------- #include<cs ...
- bzoj1806 [Ioi2007]Miners矿工配餐
[bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...
- [bzoj1806] [ioi2007]Miners 矿工配餐
相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...
- BZOJ 1806: [Ioi2007]Miners 矿工配餐
ime Limit: 10 Sec Memory Limit: 64 MBSubmit: 910 Solved: 559[Submit][Status][Discuss] Description ...
- bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...
- BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划
题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一 ...
- [IOI2007]Miners 矿工配餐
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...
- 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp
题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...
随机推荐
- tp3.2报错;syntax error, unexpected 'function' (T_FUNCTION), expecting identifier (T_STRING) or \\ (T_NS_SEPARATOR)
出错原因:这个是php版本问题,laravel5.1的php版本要求是PHP >= 5.5.9,切换一下PHP版本就行.
- ECSHOP和SHOPEX快递单号查询中通插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- SQL命令(三)
数据完整性约束 1)数据完整性约束包含:实体完整性.参照完整性.用户定义完整性. CREATE TABLE table( id INT NOT NULL AUTO_INCREMENT PRIMARY ...
- RedHat7.1 安装Oracle12102
选型: 32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2 在虚拟机器安装,采用hostonly方式设置网络 注意:能上网的网卡要设置一下I ...
- 2 socket UDP通信
1 socket套接字 class 对象 In [1]: import socket In [2]: help(socket.socket) class socket(_socket.socket) ...
- 深度学习之卷积神经网络CNN
转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...
- jmeter插件下载
https://jmeter-plugins.org/wiki/Start/ 插件下载好后,将插件lib目录下的jar包放在jmeter安装目录下的lib里,插件ext目录下的jar包放在jmeter ...
- C++重载赋值操作符
1.C++中重载赋值操作函数应该返回什么? 类重载赋值操作符一般都是作为成员函数而存在的,那函数应该返回什么类型呢?参考内置类型的赋值操作,例如 int x,y,z; x=y=z=15; 赋值行为相当 ...
- linux中wget 、apt-get、yum rpm区别
wget 类似于迅雷,是一种下载工具, 通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理名字是World Wide Web”与“get”的结合. yum: 是r ...
- Ubuntu下使用Git_5
还欠大家最后一篇Git的学习. Git的下一个内容,标签,标签是为了更方便的参考提交而给他表上通俗易懂的名称 Git可以使用两种标签,轻标签和注解标签,打上的标签是固定的,不能向分支那样可以移动位置, ...