Vijos1386 IOI2007 矿工配餐 动态规划
感觉早些年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 矿工配餐 动态规划的更多相关文章
- BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划
题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一 ...
- [IOI2007]矿工配餐
状态是f[i][a][b][c][d]表示第i个餐车,1号矿洞最近两顿是a,b,2号矿洞最近两顿是c,d. 给的空间是16MB,滚动数组滚动了第一维就行了 (给的变量是char是因为这个不超过256, ...
- [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题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...
- [IOI2007 D1T1]Miners 矿工配餐
题目大意:有$2$个煤矿,$n$天.每天给一个煤矿送餐(共有有$3$种餐),价值为它与前面两次送餐(如果有的话)不同的种类数.最大化价值. 题解:看到只有三种餐,考虑状压$DP$.$f_{i,j,k, ...
- 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内的序列,在保持相对位置不变的情况下拆分成两个序列 ...
随机推荐
- Delphi WebService 需要注意 转
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gang4415.blog.51cto.com/225775/251997 Web ...
- Asp.net 字体样式
在页面中使用到字体样式 “微软雅黑“,在静态页面中显示正常,但在asp.net页面中字体无效,此时只需把字体修改为“Microsoft YaHei";
- js 中 json对象 与 json字符串 间相互转换
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键 JSON字符串: var str1 = '{ " ...
- 用GPUImage开启相机并且开启滤镜效果
GPUImage提供了GPUImageVideoCamera这么一个类,它的对象能够调用摄像头,并且加上滤镜的效果. //init VideoCamera //这里的两个参数可以设定拍 ...
- JavaScript高级程序设计5.pdf
队列方法访问规则是FIFO(First-In-First-Out,先进先出),数组方法shift()能够移除数组中第一个项并返回该项,同时将数组长度减1,结合使用shift()和push(),可以像队 ...
- 最全面的 DNS 原理入门
DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...
- Little shop of flowers - SGU 104 (DP)
题目大意:把 M 朵花插入 N 个花瓶中,每个花插入不同的花瓶都有一个价值A[Mi][Nj],要使所有的花都插入花瓶,求出来最大的总价值(花瓶为空时价值是0). 分析:dp[i][j]表示前i朵花插入 ...
- 【转】CPU调度
转自:http://blog.csdn.net/xiazdong/article/details/6280345 CPU调度 用于多道程序 以下先讨论对于单CPU的调度问题. 回顾多道程序,同时把 ...
- JAVA Web学习篇--Servlet
Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中 ...
- C# richTextBox 重下往上依次查找关键字
private void richTextBox1_SelectionChanged(object sender, EventArgs e) { pos = richTextBox1.Sele ...