[BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
Description




最近一直在为了学习算法而做题,这道题是初一小神犇让我看的。感觉挺不错于是写了写。
这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4的取与不取的状态的二进制为j然后1~i积累的答案
以前几乎没有这么写过,因为很难想到j是没有后效性的
前一个状态有两种情况,i-1位取,i-1位不取
也就是f[i-1,j >> 1] f[i-1,j >> 1+1 << 4]
然后小朋友要怎么处理才能做到不重复不遗漏呢
答案是记录以每个点为起点,连着5位的状态为j时从那个点出发的小朋友的开心个数
显然当我们知道连着5位的状态时,完全可以推出该小朋友开不开心
这一部分很容易脑补 但是真正写起来用位运算比较方便
而i-1位是否取对当前也是没有影响的,所以这个DP就可以敲起来啦
但是如何处理环形?
固定前4位的取与不取的状态就可以啦...
最后的时间复杂度就是DP状态的O(2^5*C)
处理环的代价是O(2^4)
最后是O(2^9*C) C<=5*10^5
对于10s的时限来说还是可以过哒~
/**************************************************************
Problem: BZOJ1151
Author: mjy0724
Time:3760 ms
Memory:30336 kb
****************************************************************/ program bzoj1151;
const maxn=;
var i,j,x,n,c:longint;
e,h,l,next,link:array[-..maxn]of longint;
hate,love:array[-..maxn,-..]of boolean;
num,f:array[-..maxn,-..]of longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure solve_num;
var i,j,k,t:longint;
begin
fillchar(num,sizeof(num),);
for i:= to n do
for j:= to do
begin
k:=link[i];
while k<> do
begin
for t:= to do if (j and ( << (-t)))<> then
//这个位运算刚开始一直出错,不能写成=1因为and之后虽然只有1位是1但是不一定在最后一位QAQ
begin
if love[k,t] then
begin
inc(num[i,j]);break;//这里的break很重要 因为1个小朋友只能算一次
end;
end else
begin
if hate[k,t] then
begin
inc(num[i,j]);break;
end;
end;
k:=next[k];
end;
end;
end; procedure dp;
var head,i,j,tot,k,ans:longint;
begin
ans:=;
for head:= to do//枚举前4位的状态
begin
fillchar(f,sizeof(f),);
fillchar(f[],sizeof(f[]),);
for i:= to do
for j:=(head << i) and to (head << i) and + << i- do //and 31是小小的位运算技巧,把前面的头都去掉啦
f[i,j]:=max(f[i-,j >> ],f[i-,j >> + << ])+num[i,j]; for i:= to n- do
for j:= to do
f[i,j]:=max(f[i-,j >> ],f[i-,j >> + << ])+num[i,j];
tot:=;
for i:=n- to n do
begin
inc(tot);
for k:= to << (-tot)- do
begin
j:=k << tot+head >> (n-i);
f[i,j]:=max(f[i-,j >> ],f[i-,j >> + << ])+num[i,j];
end;
end; for i:= to do ans:=max(ans,f[n,i]);
end;
writeln(ans);
end; begin
readln(n,c);
fillchar(hate,sizeof(hate),false);
fillchar(love,sizeof(love),false);
for i:= to c do
begin
read(e[i],h[i],l[i]);
for j:= to h[i] do
begin
read(x);
if x>=e[i] then hate[i,x-e[i]+]:=true else hate[i,(x+n-e[i]) mod n+]:=true;//这里处理环的情况 表示第i个小朋友视野里的第几个是否讨厌
end;
for j:= to l[i] do
begin
read(x);
if x>=e[i] then love[i,x-e[i]+]:=true else love[i,(x+n-e[i]) mod n+]:=true;
end;
readln;
next[i]:=link[e[i]];link[e[i]]:=i;
end;
solve_num;
dp;
end.
[BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算的更多相关文章
- [bzoj1151][CTSC2007]动物园zoo_状压dp
动物园zoo 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=1151 题解: 我们发现每个点只会往右延伸$5$个,这个数非常小. 再加上每 ...
- 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...
- 基于DP+位运算的RMQ算法
来源:http://blog.csdn.net/y990041769/article/details/38405063 RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(n*log(n) ...
- 【[APIO/CTSC2007]动物园】状压DP
题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...
- bzoj 1151: [CTSC2007]动物园zoo
思路:因为每个人最多只能看到五个动物,我们考虑将其状压,f[ i ][ s ] 表示到了第 i 个位置, i, i + 1, i + 2, i + 3, i + 4这四个动物的状态为s, 此时的最大值 ...
- ACM: HDU 1028 Working out 解题报告-DP
Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- [CTSC2007]动物园zoo
link 试题分析 发现每个小朋友最多只能看到$5$个动物所以考虑状压$dp$.我们定义$f(i,j)$为第$i$个位置从此往后$5$个人的最喜欢数量.所以只要预处理出对于每个点从后$5$个会让多少小 ...
- [jzoj 6073] 河 解题报告 (DP)
interlinkage: https://jzoj.net/senior/#main/show/6073 description: solution: 考虑一条河$x$被染的效果 显然对于一条河$i ...
- [jzoj 5661] 药香沁鼻 解题报告 (DP+dfs序)
interlinkage: https://jzoj.net/senior/#contest/show/2703/0 description: solution: 注意到这本质就是一个背包,只是选了一 ...
随机推荐
- L007- linux系统优化进阶课堂小节
首先把这节课所讲的大概引锁一下,然后下面详细列举. 1.填加普通用户,通过sudo管理. 2.更改默认的SSH服务端口及禁止root用户远程连接. 3.定时自动更新服务器时间 4.关闭防火墙(ipta ...
- MySQL用户权限控制一例
Preface I supposed we are encountering a situation that there's an anonymous user has connec ...
- vi/vim 命令使用详解
1.Linux下创建文件 vi test.txt 或者 vim test.txt 或者 touch test.txt 2.vi/vim 使用 基本上 vi/vim 共分为三种模式,分别是命令模式(Co ...
- Linux-Shell脚本编程-学习-4-Shell编程-操作数字-加减乘除计算
对于任何一种编程语言都很重要的特性就是操作数字的能力,遗憾的是,对于shell脚本来说,这个过程比较麻烦,在shell脚本中有两种途径来进行数学运算操作. 1.expr 最开始的时候,shell提供了 ...
- 虚拟现实-VR-UE4-编译源代码后,无法运行
情况是这个样,在一开始我编译后,是可以运行,但是当我重新做系统后,再次运行时,每次都是到加载的18%的时候提示了如下错误 具体解决方法还没有找到,正在努力找中.........,会后续更新 同时希望有 ...
- 菜鸟级appium 必看
之所以写这个,因为太多新人,appium环境半天都搭建不好,版本问题,兼容问题等等. 自己的解决方案:1 官网下载nodejs,建议安装长期支持版 2 进入appium官网,点击下载,跳转到githu ...
- 树莓派搭建 Hexo 博客(二)
Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...
- ubuntu 14.04 安装opencv 3.0 测试
安装opencv 前面步骤参考 http://my.oschina.net/u/1757926/blog/293976 主要修改测试代码 1. 先从sourceforge上下载OpenCV的源码 2. ...
- 实现AJAX跨域访问方式一
1.添加pom依赖 <dependency> <groupId>com.thetransactioncompany</groupId> <artifactId ...
- P2P(WFD)之RegClass *****************************TBD
三个Action Frame的IE会有带上RegClass的信息 Listen Channel element, Channel List element, Operation Channel ele ...