博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj1806] [ioi2007]Miners 矿工配餐
阅读量:5292 次
发布时间:2019-06-14

本文共 1580 字,大约阅读时间需要 5 分钟。

  相当于noip前两题难度的ioi题。。。。。。。。

  还是挺好想的。。。算是状压一下?。。。两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况。。。

  先把各种情况加上各种食物后的产出与新情况预处理出来吧。(如果两餐开两维的话似乎不太好预处理)

  f[i][j][k]表示前i辆车,两个煤矿最近两餐情况分别为j和k时的最大产出。i那维滚动一下

  感觉要注意的就是,两餐的情况是有非法情况的(前一餐吃了,后一餐不吃);还有就是有的情况可能用目前的食物凑不出来。。

1 #include
2 #include
3 #include
4 using namespace std; 5 const int inf=1000233333; 6 int f[2][16][16],v[16][4],turn[16][4],num1[16]; 7 int mp[16],kind; 8 int i,j,k,n,m,x,now,pre,ans; 9 char rx;10 11 inline int max(int a,int b){
return a
3)+((i&3)>0),i++)if(!(i>3&&!(i&3))){16 mp[++kind]=i;17 for(j=1;j<4;j++){18 int x1=i>>2,x2=i&3;19 v[i][j]=(j!=x1&&j!=x2)+(x1||x2)+(x1&&x2&&x1!=x2);20 turn[i][j]=(x2<<2)|j;21 22 }23 }24 scanf("%d",&n);25 memset(f[0],150,sizeof(f[0])),f[0][0][0]=0;26 for(i=now=1,pre=0;i<=n;i++,swap(now,pre)){27 memset(f[now],150,sizeof(f[now]));28 for(rx=getchar();rx<'A'||rx>'Z';rx=getchar());29 if(rx=='M')x=1;else x=rx=='F'?2:3;30 for(j=1;j<=kind;j++)for(k=1;k<=kind;k++)31 f[now][turn[mp[j]][x]][mp[k]]=max(f[now][turn[mp[j]][x]][mp[k]],f[pre][mp[j]][mp[k]]+v[mp[j]][x]),32 f[now][mp[j]][turn[mp[k]][x]]=max(f[now][mp[j]][turn[mp[k]][x]],f[pre][mp[j]][mp[k]]+v[mp[k]][x]);33 }34 for(j=1;j<=kind;j++)for(k=1;k<=kind;k++)ans=max(ans,f[pre][mp[j]][mp[k]]);35 printf("%d\n",ans);36 return 0;37 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5186160.html

你可能感兴趣的文章
LeetCode题解之 Assign Cookies
查看>>
第八周编程总结
查看>>
Java-----思想认识
查看>>
ASP.NET - TreeView控件,只操作最后一级节点
查看>>
设计模式示例系列随笔
查看>>
HTTP协议概述
查看>>
Available to Promise (ATP) in SAP-SD
查看>>
Google Talk
查看>>
Spring 之注解事务 @Transactional
查看>>
ArrayList,LinkedList的对比
查看>>
eclipse 最简单的方法 显示行号
查看>>
Winform应用ssk皮肤
查看>>
Java实现二叉树先序,中序,后序遍历
查看>>
Hello World
查看>>
java 打印栈信息
查看>>
解决flex4 分辨率自适应问题
查看>>
表扫描和索引扫描
查看>>
移动硬盘加密!让windows用户无法查看移动硬盘!
查看>>
部署Flask项目到腾讯云服务器CentOS7
查看>>
使用python实现京东抢购脚本
查看>>