链接题面

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

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

方程是  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. JS高阶函数的使用

    1.何为高阶函数呢? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数.简单来说,就是对其他 ...

  2. [转载]实现DDOS攻击自动封禁IP

    1 #!/bin/bash 2 ############################################################# 3 # File Name: ddos_ch ...

  3. 三、k8s集群可用性验证与调参(第一章、k8s高可用集群安装)

    作者:北京小远 出处:http://www.cnblogs.com/bj-xy/ 参考课程:Kubernetes全栈架构师(电脑端购买优惠) 文档禁止转载,转载需标明出处,否则保留追究法律责任的权利! ...

  4. python内置函数dir()

    描述 dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用.如果参数不包含__dir__(), ...

  5. Thinkphp大批量插入数据库的处理方法和速度对比

    最近在使用TP框架写一个读取excel数据并将其插入到mysql数据库中的小功能.当excel中的数据条数非常多(几千甚至上万),并且多很多个列,并且某些列的内容还非常多的时候就容易出现问题. 第一种 ...

  6. Linux上常用插件的一些命令

    Linux上关于jdk tomcat MySQL dubbo等的一些启动,结束,查看状态的命名. 1.tomcat 运行tomcat cd bin/ 进入tomcat 的bin 文件夹,直接运行: . ...

  7. 用Pygal画一个英雄能力的图

    效果图: 这是在google浏览器下打开的html. play.py #!/usr/bin/env python # _*_ coding: UTF-8 _*_ """= ...

  8. 第十八篇 -- 在C++中嵌入汇编语言

    基于C++宝典的学习 一.什么是汇编语言 汇编语言是一种功能很强的程序设计语言,也是利用了计算机所有硬件特性并能直接控制硬件的语言.在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Sym ...

  9. <textarea></textarea>标签的placeholder属性不生效问题

    <textarea></textarea>标签的placeholder属性不生效问题   1.在用到<textarea></textarea>标签时,设 ...

  10. Python - 基础数据类型 dict 字典

    字典简介 字典在 Python 里面是非常重要的数据类型,而且很常用 字典是以关键字(键)为索引,关键字(键)可以是任意不可变类型 字典由键和对应值成对组成,字典中所有的键值对放在 { } 中间,每一 ...