题意:给定一个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 动物园的更多相关文章

  1. 洛谷[P3622] 动物园

    状压DP 发现本题中,每个小朋友是否高兴仅取决于其后五个动物的情况,我们可以用状压DP解决本题 首先已处理 num[i][s] 表示对于位置 i ,状态为 s 时有多少在 s 的同学满意 转移方程很好 ...

  2. 洛谷 P2375 动物园

    题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...

  3. 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】

    这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...

  4. 洛谷 P3622 [APIO2007]动物园【状压dp】

    看成网络流建图想了好久... 实际上5个是可以状压的 设f[i][k]为到第i个围栏状态为k的方案数,因为考虑到重复,设g[i][k]记录i开始,状态为k的孩子有几个 状态转移很好想:f[j][k]= ...

  5. 洛谷P2375 动物园

    我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...

  6. [洛谷P2375] [NOI2014]动物园

    洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...

  7. 【题解】洛谷P2375 [NOI2014] 动物园(KMP)

    洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...

  8. 洛谷2375 BZOJ 3670动物园题解

    题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...

  9. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. EXPERT FOR SQL SERVER诊断系列--索引

    概述   索引设计是数据库设计中比较重要的一个环节,对数据库的性能起着至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其 ...

  2. C#_获取路径

    一.获取当前文件的路径 1.  System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName  获取模块的完整路径,包括文件名. ...

  3. Bash笔记

    expect写法 /usr/bin/expect <<-EOF set timeout 3000 spawn ssh root@${server_ip} expect { "pa ...

  4. for...else 小记

    for ......: ...... else: ...... 在 for 循环中,若没有执行 break ,正常结束,则会执行 else 中的语句. 若执行了 break , 则 不会 执行 els ...

  5. mysql操作命令梳理(4)-中文乱码问题

    在平时的mysql运维操作中,经常会碰到插入中文字段后出现乱码的情况,产生中文乱码的原因一般有:1)mysql的编码格式不对,是latin1编码.强烈推荐将mysql下的编码格式都改为utf8,因为它 ...

  6. cordova打包webapp

    cordova打包webapp 在项目开发中,需要将h5页面打包成app,这个时候我们可以使用cordova来打包.在官方文档中,我们可以了解到创建一个app十分简单,你的电脑上有nodejs就行,我 ...

  7. Individual Project-word frequency

    预计时间: 项目要求理解:半小时 c#语言了解:6小时 构思程序框架:2小时 编写调试程序:4小时 项目实际完成时间: 项目要求理解:半小时 c#语言了解:6小时 构思程序框架:2小时 编写调试程序: ...

  8. 《Linux内核分析》chapter4

  9. 去掉UITabBar和NavigationBar上的黑线

    在UITabBarViewController界面设置 self.tabBar.barStyle = UIBarStyleBlack; 在NavigationController界面设置 self.n ...

  10. Dynamic Routing Based On Redis

    Dynamic Routing Based On Redis Ngnix技术研究系列2-基于Redis实现动态路由   上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反 ...