链接题面

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

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

方程是  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. Spring学习总结(一)---谈谈对Spring IOC的理解(一:理论知识理解)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  2. 团队开发day10

    项目整合成功,测试功能基本达到,目标完成!

  3. Lesson 12 Life on a desert island

    Lesson 12 Life on a desert island desert island ['dezət 'ailənd] n. 荒岛 uninhabited island coral isla ...

  4. spring boot(二)整合mybatis plus+ 分页插件 + 代码生成

    先创建spring boot项目,不知道怎么创建项目的 可以看我上一篇文章 用到的环境 JDK8 .maven.lombok.mysql 5.7 swagger 是为了方便接口测试 一.Spring ...

  5. dubbo(四)

    前言 1.浅谈架构的发展 首先,要了解dubbo,就得了解,它是在什么背景下产生的?这就需要从架构的发展说起. 孟老师从事软件开发2008年份,那时候我上高一,那个时候,淘宝.京东都还没有火起来.那个 ...

  6. informix常见问题

    1.中文乱码 https://www.cnblogs.com/equation/p/5545967.html 2.informix创建数据库和用户 https://wenku.baidu.com/vi ...

  7. Docker隔离技术

    前言 Docker系列文章: 此篇是Docker系列的第九篇,之前的文章里面或多或少的提到Docker的隔离技术,但是没有很清楚的去聊这个技术,但是经过这么多文章大家一定对Docker使用和概念有了一 ...

  8. 迈达斯midas Gen 2019 2.1 中文汉化安装教程

    midas Gen 2019 v2.1 for win是一款关于结构设计有限元分享的工具,分为建筑领域.桥梁领域.岩土领域.仿真领域四个大类.具有人性化的操作界面,且采用了优秀的的计算机显示技术,是建 ...

  9. CExec.jsp中请求过程

  10. labview系列-中级计算器开发

    本例子通过对中级计算器的操练,实现对结构/字符串等基础知识的掌握和理解,为后续的编程工作提供基础. 计算器开发原理:通过按钮触发事件,再各个事件中编写相应加减乘除方法,并显示在结果中即可. 要点:临时 ...