洛谷P3622 动物园
题意:给定一个n个元素的圈,m个条件。满足一个条件需要选某些元素或不选另一些元素。
问最多能满足多少条件。每个条件所关联的元素,最远的两个距离不会超过5。
解:想了半天......
首先能想到断环成链DP。
然后某个时刻灵光一闪,突然发现可以状压最近的5个位置......这样枚举开始位置做32次DP就行了!
实现的时候发现只要枚举16种开始情况,状压4个位置...
转移就是考虑下一个位置选/不选。
注意细节......为什么有人20行A题,我写了160行呀...
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm> const int N = ; struct Node {
int p, fear, like;
int a[]; // 0 none 1 fear 2 like
}node[ * N]; int f[N][], n;
std::vector<int> v[N]; inline void exmax(int &a, int b) {
a < b ? a = b : ;
return;
} inline void out(int x, int tag) {
printf(" ");
for(int i = ; i < tag; i++) {
printf("%d", (x >> i) & );
}
printf(" ");
return;
} inline int check(Node x, int s) {
for(int i = ; i < ; i++) {
if(x.a[i] == && ((s >> i) & )) {
return ;
}
if(x.a[i] == && (((s >> i) & ) == )) {
return ;
}
}
return ;
} int main() { int m;
scanf("%d%d", &n, &m);
for(int i = , x; i <= m; i++) {
scanf("%d%d%d", &node[i].p, &node[i].fear, &node[i].like);
node[i].p += ;
while(node[i].p > n) {
node[i].p -= n;
}
for(int j = ; j <= node[i].fear; j++) {
scanf("%d", &x);
for(int k = , now = node[i].p + ; k >= ; k--) {
now--;
if(!now) {
now = n;
}
if(now == x) {
node[i].a[k] = ;
break;
}
}
}
for(int j = ; j <= node[i].like; j++) {
scanf("%d", &x);
for(int k = , now = node[i].p + ; k >= ; k--) {
now--;
if(!now) {
now = n;
}
if(now == x) {
node[i].a[k] = ;
break;
}
}
}
v[node[i].p].push_back(i);
}
/// input
int ans = ;
/// -----
///
for(int op = ; op < ; op++) { /// first four
memset(f, , sizeof(f));
for(int s = ; s < ; s++) {
if(s != op) {
f[][s] = -;
}
} for(int i = ; i < n; i++) {
for(int s = ; s < ; s++) {
if(f[i][s] == -) {
continue;
}
/// f[i][s] -> f[i + 1][t] int t = s >> , temp = f[i][s]; /// put 0 don't move
for(int j = ; j < v[i + ].size(); j++) {
/// node[v[i + 1][j]] and s
temp += check(node[v[i + ][j]], s);
}
exmax(f[i + ][t], temp);
// -------------------------------------
t = t | ( << ); /// put 1 move
temp = f[i][s];
for(int j = ; j < v[i + ].size(); j++) {
temp += check(node[v[i + ][j]], s | ( << ));
}
exmax(f[i + ][t], temp);
}
}
for(int s = ; s < ; s++) {
/// f[n][s]
int temp = f[n][s], now = s << ;
for(int i = ; i < ; i++) {
now = (now >> ) + (((op >> i) & ) << );
for(int j = ; j < v[i + ].size(); j++) {
temp += check(node[v[i + ][j]], now);
}
}
exmax(ans, temp);
}
}
printf("%d\n", ans);
return ;
}
AC代码
洛谷P3622 动物园的更多相关文章
- 洛谷[P3622] 动物园
状压DP 发现本题中,每个小朋友是否高兴仅取决于其后五个动物的情况,我们可以用状压DP解决本题 首先已处理 num[i][s] 表示对于位置 i ,状态为 s 时有多少在 s 的同学满意 转移方程很好 ...
- 洛谷 P2375 动物园
题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...
- 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】
这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...
- 洛谷 P3622 [APIO2007]动物园【状压dp】
看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...
- 洛谷P2375 动物园
我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【题解】洛谷P2375 [NOI2014] 动物园(KMP)
洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...
- 洛谷2375 BZOJ 3670动物园题解
题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
随机推荐
- mysql下批量清空某个库下的所有表(库不要删除,保留空库)
总所周知,mysql下要想删除某个库下的某张表,只需要切换到该库下,执行语句"drop table tablename"即可删除!但若是该库下有成百上千张表,要是再这样一次次执行d ...
- 第六次Scrum meeting
第六次Scrum meeting 任务及完成度: 成员 12.21 12.22 陈谋 任务1040:完成stackoverflow的数据处理后的json处理(98%) 任务1114-1:完成对网页数 ...
- Linux内核分析——进程的描述和进程的创建
进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB——task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...
- 第二个spring冲刺第10天(及第二阶段总结)
第二阶段算是结束了,第二阶段,我们实现了基本的功能,这是软件的开始页面,点击便会进入学习画面,目前学习画面还有待改善 燃尽图3 眨眼就完结了第二阶段的冲刺了,大致整体结构已经完成. 第二阶段总体是 ...
- [buaa-SE-2017]个人项目
个人项目 Part1:github https://github.com/Aria-K-Alethia/Sudoku Part2:解题思路描述 关于数独的解法 我选择的是暴力搜索算法. (1)关于 - ...
- 编写一个shell脚本来编译并运行java代码
概述 编译和运行java分别要用到javac命令和java命令,虽然可以使用IDE(比如eclipse,InteliJ,NetBean...),按一下快捷键就可以实现编译并运行,但是,在之前还要配置一 ...
- CI框架2.x的验证码中所遇问题解决
用php版本是5.6,CI框架版本是2.x,在使用验证码(captcha)时,遇到一些问题. 首先,我查看框架手册,说必需的两个参数是"img_url",“img_path”,其他 ...
- Minify or format javascript file by web or notepad++
Notepad++ plugin manager install 'JSTOOL' http://tool.oschina.net/codeformat/js https://www.cnblogs. ...
- appium学习记录2
unittest 学习 每执行一次 testcase 就会调用一次 setUP 与teardown 类方法只会执行一次 开始 与结束时候执行 类似反射方法 __init__ 与 __del__ set ...
- git-stash用法小结
[时间:2016-10] [状态:Open] [关键词:git,版本控制,版本管理,stash,git储藏] 缘起 今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原因 ...