链接题面

看清楚找到小数据范围,第一维表示遍历到的栅栏,第二维是五位状态

先预处理每个状态会使多少小朋友高兴

方程是  f[i][j]=max(f[(i&((1<<4)-1))<<1][j-1],f[((i&((1<<4)-1))<<1)+1][j-1])+b[j][i]

简单点就是  f[i][j]=max(f[(i&15)<<1][j-1],f[((i&15)<<1)+1][j-1])+b[j][i]

一开始想的枚举小朋友,每次转移状态时移的位数不确定,这样有55分,缺点是不能方便处理环,有55分(想调应该也行,不过我调的tle了,我太菜了)

 1 #include <bits/stdc++.h>
2 using namespace std;
3 int a[50005][6];int b[50005][1<<5];
4 int head[50005];
5 int f[1<<5][50005];
6 int main()
7 {
8 int n,c;
9 cin>>n>>c;
10 for(int i=1;i<=c;i++)
11 {
12 int e,f,l;
13 scanf("%d%d%d",&e,&f,&l);
14 head[i]=e;
15 for(int j=1;j<=f;j++)
16 {
17 int x;scanf("%d",&x);
18 if(x<e)x+=n;
19 a[i][x-e+1]=-1;
20 }
21 for(int j=1;j<=l;j++)
22 {
23 int x;scanf("%d",&x);
24 if(x<e)x+=n;
25 a[i][x-e+1]=1;
26 }
27 for(int j=0;j<=(1<<5)-1;j++)
28 for(int k=1;k<=5;k++)
29 if((((j>>(k-1))&1)&&(a[i][k]==1))||((!((j>>(k-1))&1))&&(a[i][k]==-1)))
30 b[i][j]=1;
31 }
32 for(int j=0;j<=c;j++)
33 for(int i=0;i<=(1<<5)-1;i++)
34 {
35 int k=head[j+1]-head[j];
36 for(int p=0;p<=(1<<5)-1;p++)
37 {
38 if((p&((1<<(5-k))-1))!=(i>>k))continue;
39 f[p][j+1]=max(f[p][j+1],f[i][j]+b[j+1][p]);
40 }
41 }
42 int ans=0;
43 for(int i=1;i<=(1<<5)-1;i++)
44 ans=max(ans,f[i][c]);
45 cout<<ans;
46 }

正解应该枚举栅栏,这样移位就是固定的

关键点:环的处理,状态里每一位的顺序(从右到左)

处理环就是在外面再套一层循环,枚举起点的状态,最后只有状态和起点相同才合法,所以只要f[l][n],还有就是每次枚举只有f[l][0]是合法的,别的不能用来转移,赋值负无穷

二进制存数是最右面的是第一位,每次状态转移是要i的上一个状态的后四位推到i,这里倒回去,故i的上一位是i的前四位再加上一个0或1,注意右边是前,左边是后,位运算不要弄反

觉得初始化没啥难的,就是把读入存起来if判断就行了,满足其一就能让他高兴,由于小朋友的视野存在完全重叠(样例2)的可能,一个状态可能让多个小朋友高兴,由于我们已经破环为链,没有后效性

AC代码,时间也可以

 1 #include <bits/stdc++.h>
2 using namespace std;
3 int a[50005][6];int b[50005][1<<5];
4 int head[50005];
5 int f[1<<5][50005];
6 int main()
7 {
8 int n,c;
9 cin>>n>>c;
10 for(int i=1;i<=c;i++)
11 {
12 int e,f,l;
13 scanf("%d%d%d",&e,&f,&l);
14 head[i]=e;
15 for(int j=1;j<=f;j++)
16 {
17 int x;scanf("%d",&x);
18 if(x<e)x+=n;
19 a[i][x-e+1]=-1;
20 }
21 for(int j=1;j<=l;j++)
22 {
23 int x;scanf("%d",&x);
24 if(x<e)x+=n;
25 a[i][x-e+1]=1;
26 }
27 for(int j=0;j<=(1<<5)-1;j++)
28 {
29 for(int k=1;k<=5;k++)
30 if((((j>>(k-1))&1)&&(a[i][k]==1))||((!((j>>(k-1))&1))&&(a[i][k]==-1)))
31 {b[e][j]++;k=6;}
32 }
33 }
34 int ans=0;
35 for(int l=0;l<=(1<<5)-1;l++)
36 {
37 for(int j=0;j<=(1<<5)-1;j++)f[j][0]=-99999999;
38 f[l][0]=0;
39 for(int j=1;j<=n;j++)
40 for(int i=0;i<=(1<<5)-1;i++)
41 f[i][j]=max(f[(i&15)<<1][j-1],f[((i&15)<<1)+1][j-1])+b[j][i];
42 ans=max(ans,f[l][n]);
43 }
44 cout<<ans;
45 return 0;
46 }

总结一下大体思路是对的,只不过重要的细节处理有时候自己还是一个人想不清楚,慢慢琢磨琢磨也就好了,不要依赖题解

一点一点的进步

APIO 2007 动物园 题解的更多相关文章

  1. 【[APIO/CTSC2007]动物园】状压DP

    题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...

  2. 【KMP】洛谷P2375 [NOI2014]动物园 题解

        一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...

  3. [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)

    [BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...

  4. BZOJ3670 & 洛谷2375 & UOJ5:[NOI2014]动物园——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3670 https://www.luogu.org/problemnew/show/P2375#su ...

  5. APIO 2007 风铃

    题目描述 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...

  6. 洛谷2375 BZOJ 3670动物园题解

    题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...

  7. dp式子100个……

    1.        资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2------01背包问题F[I,j]:=max(f[i- ...

  8. dp方程

    1.        资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2 ------01背包问题   F[I,j]:=ma ...

  9. hdu 1863 - 畅通工程(MST)

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. 流媒体传输协议(rtp/rtcp/rtsp/rtmp/mms/hls)转

    常用的流媒体协议主要有HTTP渐进下载和基于RTSP/RTP的实时流媒体协议两类.在流式传输的实现方案中,一般采用HTTP/TCP来传输控制信息,而用RTP/UDP来传输实时多媒体数据. 1 实时传输 ...

  2. Java8实战——自己的总结

    java8 介绍   java8是2014年3月份,由Oracle发布的一个版本,又称之为jdk1.8,是现再我们在学习和工作中用的最多的一个版本.   在jdk1.8中,java8以添加非常多的新特 ...

  3. Java | 标识符 & 关键字

    标识符是什么? 标识符 标识符是指在程序中,我们自己定义的内容.比如类的名字.方法的名字和变量的名字等等,都是标识符.在我们写的第一个程序当中,我们给类起名叫做Hello 也叫做标识符. 命名规则 标 ...

  4. commons-collections利用链学习总结

    目录 1 基础 ConstantTransformer InvokeTransformer ChainedTransformer LazyMap TiedMapEntry TransformingCo ...

  5. File类与常用IO流第十章——序列化流

    第十章.序列化流 序列化流和反序列化流概述 序列化:用一个字节序列表示一个对象,该字节序列包含该对象的数据.对象的类型和对象中存储的属性等等信息.字节序列写出到文件后,相当于文件中持久保存了一个对象的 ...

  6. C#/.NET/.NET Core学习视频汇总(持续更新ing)

    前言: 之前有很多小伙伴在我的公众号后台留言问有没有C#/.NET/.NET Core这方面相关的视频推荐,我一般都会推荐他们去B站搜索一下.今天刚好有空收集了网上一些比较好的C#/.NET/.NET ...

  7. Junit测试用例配置Log4j

    用Junit测试非常方便,但有时我们想要看日志来方便排除,使用spring+log4j时,用Junit测试看日志很多人都不太会,即如何将Junit与log4j进行整合. 我也是研究了半天,才终于找到了 ...

  8. Jmeter性能测试指标分析

    一.Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为"聚合报告 如果大家都是做Web应用的性能测试,例如访问百度请求为例,线程10,循环10次, ...

  9. GraphQL 概念入门

    GraphQL 概念入门 Restful is Great! But GraphQL is Better. -- My Humble Opinion. GraphQL will do to REST ...

  10. Oracle19c 如何用rman duplicate 克隆一个数据库。(Backup-Based, no achive log)

    Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...