链接题面

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

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

方程是  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. buu RSA

    一.分析 下载链接,发现一个公钥的文件(e,n),和一个加密过的文件 二. 公钥文件,里面一堆字母,然后后面百度,才知道需要去解开n,e 指数是e,模数是n(十六进制) 三.再通过n来分解素数,得到p ...

  2. java封装继承以及多态(含代码)

    封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...

  3. ftp错误&&详解方案

    一.FTP错误代码列表150 文件状态良好,打开数据连接 200 命令成功 202 命令未实现 211 系统状态或系统帮助响应 212 目录状态 213 文件状态 214 帮助信息,信息仅对人类用户有 ...

  4. OpenFlow协议分析

    OpenFlow协议分析实验手册 启动虚拟机mininet 和 控制器 ODL 启动wireshark,在控制器的ens32 网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovs ...

  5. windows服务器下MySQL配置字符集

    这俩天公司使用.netcore微服务+mysql做项目,mysql在使用的时候总是出现一些字符集的问题,修改utf8或utf8mb4后mysql的服务就启动不了,这里做下记录如果把my.ini中的字符 ...

  6. HMAC简介及HMAC-SHA256实现Demo

    一.什么是HMAC HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思. HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HM ...

  7. 42 张图带你撸完 MySQL 优化

    Hey guys,这里是程序员cxuan,欢迎你阅读我最新一期的文章,这篇文章是 MySQL 调优的汇总版,我加了一下日常开发过程中的调优经验,希望对各位小伙伴们有所帮助.下面开始正文. 一般传统互联 ...

  8. 给你的Mac 整个好用的命令行iTerm2 + zsh + oh-my-zsh + powerlevel10k

    给你的Mac 整个好用的命令行iTerm2 + zsh + oh-my-zsh + powerlevel10k 介绍 iTerm2 是一个MacOS 下的终端模拟器,和其他的终端本质上没啥大不同.但相 ...

  9. 离散数学-传递闭包(POJ3275)

    就是n的元素给定m个关系求他们之间的关系. eg.  ∵a>b and b>c ∴a>c emmmm 若要知道n个元素的绝对关系,则需知道C(n,2)个关系. 例题:POJ3275 ...

  10. NOI Online 提高组 题解

    来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...