题意:给定一个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. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...

  2. Iptables防火墙规则使用梳理

    iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤.封包重定向和网络地址转换(NAT)等功能 ...

  3. Spring RPC 入门学习(3)-获取Student对象

    Spring RPC传递对象. 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; import ...

  4. 2016-03-22 OneZero团队 Daily Scrum Meeting

    会议时间: 2016-03-22 9:33-9:57am 会议内容: 一.在原有Sprint Backlog基础上,我们加了亮点(摇一摇功能:随机选取一条记录在界面显示,以提醒主页君回忆) 需求分析图 ...

  5. 使用highcharts绘制美观的燃尽图

    使用highcharts绘制美观的燃尽图 助教在博客中介绍了两种绘制燃尽图的方法,但是我们组在使用时发现有些任务不适合写进issue,而且网站生成的燃尽图不是很美观,因此我们打算使用其他方法自己绘制燃 ...

  6. 《Linux内核设计与实现》第七章读书笔记

    第七章.中断和中断处理 7.1中断 中断使得硬件得以发出通知给处理器.中断随时可以产生,内核随时可能因为新来到的中断而被打断. 不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志.操作系统给 ...

  7. Linux内核分析 期末总结

    Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...

  8. 2丶利用NABCD模型进行竞争性需求分析

    确定项目:公交查询系统 分析小组:在路上 选择比努力更重要.一个项目成功自然离不开组员们的努力.但是,光努力是不够的.还需要用户有需求,能快速实现. 这些东西,看似很虚,却能让我们少走不少弯路.做项目 ...

  9. Particle filter for visual tracking

    Kalman Filter Cons: Kalman filtering is inadequate because it is based on the unimodal Gaussian dist ...

  10. Geekers团队成立日志

    大家好,作为团队的队长,今天在这里非常荣幸能够发表我们团队的第一篇博客,来宣布我们团队的名字:Geekers! Geek,英文中代表“怪人”,随着时代进步Geek被赋予了新的含义——极客!Steve ...