[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: 注意到这本质就是一个背包,只是选了一 ...
随机推荐
- 获取已安装app的bundle id
备注:以下是私有api 苹果审核会被拒绝. 导入头文件 #import <objc/runtime.h> /// 获取其他APP信息(iOS11无效) + (NSArray *)getOt ...
- 生产者与消费者-N:1-基于list
多个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...
- 【app.js】配置及App函数说明
app.js中的App函数用来注册一个小程序或设置全局变量. App函数: 语法:App(Object) 参数: Object json对象 说明: App函数必须在app.js中调用 ...
- 企业级Tomcat部署配置
1.1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人 ...
- LeetCode - 1. Two Sum(8ms)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- LeetCode 82 ——删除排序链表中的重复元素 II
1. 题目 2. 解答 新建一个链表,并添加一个哨兵结点,从前向后开始遍历链表. 如果下一个结点的值和当前结点的值相等,则循环向后遍历直到找到一个和当前结点值不相等的结点: 反之,如果下一个结点的值和 ...
- Python攻击
python DOS攻击 2版本 #!/usr/bin/env python import socket import time import threading #Pressure Test,d ...
- Coursera: Internet History, Technology, and Security
课程网址:https://www.coursera.org/learn/internet-history 学习笔记: Week 1: History - Dawn of Early Computing ...
- 第一个Spring小程序实战
ps:本文偏向原理和操作性,原理适合于任何编译器. 支持Spring入门,目的是在xml文件里面装配相关bean(java对象),并实现获取.(IOC) 一.先建立一个Spring新项目,添加mave ...
- SSH答疑解惑系列(二)——java.lang.reflect.InvocationTargetException异常
在项目中遇到了invocationTargetException的问题,在这里跟大家分享一下. 报错信息如下: 使用反射时,比如执行invoke方法,如果被反射执行的方法体抛出了Exception,这 ...