APIO 2007 动物园 题解
看清楚找到小数据范围,第一维表示遍历到的栅栏,第二维是五位状态
先预处理每个状态会使多少小朋友高兴
方程是 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 动物园 题解的更多相关文章
- 【[APIO/CTSC2007]动物园】状压DP
题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...
- 【KMP】洛谷P2375 [NOI2014]动物园 题解
一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...
- [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)
[BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...
- BZOJ3670 & 洛谷2375 & UOJ5:[NOI2014]动物园——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3670 https://www.luogu.org/problemnew/show/P2375#su ...
- APIO 2007 风铃
题目描述 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风 ...
- 洛谷2375 BZOJ 3670动物园题解
题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...
- 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- ...
- dp方程
1. 资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2 ------01背包问题 F[I,j]:=ma ...
- hdu 1863 - 畅通工程(MST)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- Django基础009--Paginator分页
1.引入 from django.core.paginator import Paginator 2.Paginator对象提供的方法 articles = models.Article.object ...
- if语句 条件测试 shell编程之条件语句
shell 编程之条件语句一.条件测试 ① test命令 测试 ② 文件测试 ③ 整数值比较 ④ 字符串比较 ⑤ 逻辑测试二.if语句的结构 单分支结构 双分支结构 多分支结构三.ca ...
- Intellij idea 设置关闭自动更新
目录结构: File -> Settings- -> Appearance & Behavior -> System Settings -> Updates 把Auto ...
- 高校表白App-团队冲刺第四天
今天要做什么 就如昨天所说,今天继续进行引导页制作的学习.并开始通过ViewPager做简单的布局与Activity. 遇到的问题 本来以为只是使用一个ViewPager控件就可以搞定,原来还是需要配 ...
- 【路径规划】 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame (附python代码实例)
参考与前言 2010年,论文 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame 地址:https ...
- 【学习笔记】Tensor多维数组和axis的理解
Tensor多维数组和axis的理解 今天在编写程序的时候一直对于axis=0或等于1搞不明白,这样对于整个numpy或者是tensorflow的基本运算和数据处理都会很模糊,所以花了一些时间来搞清楚 ...
- 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【五】
BearPi-HM_Nano开发板鸿蒙OS内核编程开发--消息队列 什么是消息队列? 答:消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问题.实现高性能. ...
- BOM(Bill of Material)物料清单基础知识(一)
一.BOM的基础概念 概 ...
- [WinError 10013]以一种访问权限不允许的方式做了一个访问套接字的尝试
Django报错截图如下: 原因分析:出现这种情况在Windows中很常见,就是端口被占用 解决步骤: 1:进入windows中的命令行窗口(win+R之后输入cmd就可以进去) 2:输入 net ...
- vscode安装ESlint配置
先安装插件ESLint,后面在设置setting.json中配置加入代码: { "files.autoSave": "afterDelay", "ed ...