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内的序列,在保持相对位置不变的情况下拆分成两个序列 ...
随机推荐
- bzoj2597
非常好的网络流题目 首先这里用到了求补集的思想,我们可以先求不满足的三元对的情况 设A-->B代表A赢B 由于最后所有胜负关系都确定,一定是一个完全图,所以任意一个不合法的三元对,单独取出来一定 ...
- nodejs之日志管理
开发一个项目时,可以通过控制台输出或者debug来获取到项目的运行信息.当项目上线时,我们就需要通过日志来分析.如同Java的log4j,nodejs中也有相关的log4js.使用过log4j的同学应 ...
- 【响应式Web设计实践 #BOOK#】
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 【转】android 完全退出应用程序
原文网址:http://www.yoyong.com/archives/199 android退出应用程序会调用android.os.Process.killProcess(android.os.Pr ...
- Linux下USB烧写uImage kernel
Linux下USB烧写uImage kernel 1.启动开发板,进入u-boot:(如果开发板中没有系统,可以通过用SD卡方式启动开发板进入) U-Boot 2011.06 (Mar 19 ...
- 这几天阅读的shadowgun的几个shader
直接从阅读时记录的笔记摘抄过来,写的比较随意. 1. MADFINGER-blinking-god-rays 除了可以用于实现太阳光线效果,还能调整参数让颜色随时间淡入淡出闪烁,能做出想灯光之类的效果 ...
- GPUImage实现过程
GPUImage就是一个函数的类库,用于对图片实现滤镜的效果. 下面是实现一个最简单的GPUImage的程序和讲解: 首先新建一个项目,导入GPUImage类库(导入过程在我的另一个博客里面有写). ...
- Codeforces Round #208 (Div. 2) 358D Dima and Hares
题目链接:http://codeforces.com/problemset/problem/358/D 开始题意理解错,整个就跪了= = 题目大意:从1到n的位置取数,取数的得到值与周围的数有没有取过 ...
- lightoj 1021 - Painful Bases 状态压缩
题目链接:http://lightoj.com/volume_showproblem.php?problem=1021 #include<cstring> #include<cstd ...
- hdoj 1045 Fire Net
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...