UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集
UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集
ACM
题意:
有一个由编号0~n-1的n台计算机组成的网络,一共同拥有n种服务,每台计算机上都执行着所有服务,对于每台计算机,你能够选择停止一项服务,这个行为会导致与这台计算机和与他相连的其它计算机上的这项服务都停止(原来已经停止的继续保持停止状态)。
求最多能使多少个服务瘫痪(即没有不论什么一台计算机在执行这项服务)。
分析:
题目说白了。就是:
把n个集合p[i],0<=i<n分成尽量多组,使得每组中各个集合的并集为全集。
利用状态压缩。记录每一个节点执行的服务。因为数据大小就16所以直接能够用int范围数字表示一个集合。
然后预处理下cover,处理16个节点组成的各个集合会带来的挺服务效果。
然后dp,假设cover[S0] == all (all全为1) 那么是S^S0 的部分也有可能终止服务 。dp[S] = max(dp[S], dp[S^S0]+1)。
參考了凌乱的心巨巨的题解,嘛。是为了了解枚举子集做的题目。
枚举子集的模板:
// 对于集合Sfor (int S0 = S; S0; S0 = S&(S0 - 1)) // 枚举S0为子集...原理:
S&(S0 - 1)实际上是把S中的0所有忽略。并不断减1的结果。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* File: 11825.cpp
* Create Date: 2014-06-27 20:43:48
* Descripton: sub set/ dp/ numeric
*/ #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 16; int n, m, t, mask[N], cover[1<<N], dp[1<<N], tot; int main() {
int cas = 0;
while (~scanf("%d", &n) && n) {
// input
for (int i = 0; i < n; i++) {
scanf("%d", &m);
mask[i] = (1 << i);
while (m--) {
scanf("%d", &t);
mask[i] |= (1 << t);
}
} // get the union set of cover
for (int S = 0; S < (1 << n); S++) {
cover[S] = 0;
for (int i = 0; i < n; i++) {
if (S & (1 << i)) {
cover[S] |= mask[i];
}
}
} // dp
dp[0] = 0;
tot = (1 << n) - 1;
for (int S = 1; S < (1 << n); S++) {
dp[S] = 0;
for (int S0 = S; S0; S0 = (S0 - 1)&S) {
if (cover[S0] == tot) {
dp[S] = max(dp[S], dp[S^S0] + 1);
}
}
} printf("Case %d: %d\n", ++cas, dp[tot]);
}
return 0;
}
UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集的更多相关文章
- P5911 [POI2004]PRZ (状态压缩dp+枚举子集)
题目背景 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 题目描述 桥已经很旧了, 所以它不能承受太重的东西.任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时 ...
- uva 11825 Hackers' Crackdown (状压dp,子集枚举)
题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪( ...
- UVA 11825 Hackers’ Crackdown 状压DP枚举子集势
Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
随机推荐
- mysql5.7官网直译SQL语句优化--分组优化
1.14Group By Optimization 分组优化 大多数方法为了满足分组查询需要扫描整个表并且创建一个临时表,其中每组中的值都是连续的,如果可以使用聚合函数和临时表获取各个分组.在某些情况 ...
- Java web开发中主要用到的jar包
1.Java开发中主要用到的jar包介绍:(1)java JDK基础开发包:java包和javax包.书写方式:import java.lang.reflect.InvocationTargetExc ...
- HDU 4312 Contest 2
题目要求两点间的最大值作为距离即: 即是切比雪夫距离.而切比雪夫距离与曼哈顿距离的转换却很巧妙. 把平面坐标所有点绕原点逆向旋转45度后,所得点的曼哈顿距离之和除以√2,即是切雪比夫距离.旋转点的公式 ...
- 带输出參数的存储过程的定义,以及在aso.net中调用
ALTER proc [dbo].[mp_w_RechargePortalPayPal_All] ( @PayPalOrderNo nvarchar(50), --订单号 @nAccountIDFro ...
- 无法连接虚拟设备 ide1:0,因为主机上没有相应的设备。您要在每次开启此虚拟机时都尝试连接此虚拟设备吗?
转自:http://blog.51cto.com/thawliu/1704876 安装虚拟机时出现提示:无法连接虚拟设备 ide1:0,因为主机上没有相应的设备.您要在每次开启此虚拟机时都尝试连接此虚 ...
- 大量文件时使用ls
有时一个目录下的文件实在太多, ls的时候就卡住了. 其实, 如果不加排序的话, 就可以迅速的显示文件. ls -f 解释: -f do not sort, enable -aU, disable - ...
- 18.boost 图的拓扑排序
运行结果: 代码示例: #include <iostream> #include <vector> #include <deque> #include <bo ...
- BZOJ 2045 容斥原理
思路: 同BZOJ 2005 http://blog.csdn.net/qq_31785871/article/details/54314774 //By SiriusRen #include < ...
- Windows 10 秋季更新错误
uefi 启动丢失修复 bcdboot c:\windows /s y: /f uefi /l zh-cn 0x80240034 你尝试安装的内部版本是有签名的外部测试版.若要继续安装,请启用外部测试 ...
- word-wrap与word-break的区别,以及无效情况
两种方法的区别说明: 1,word-break:break-all 例如div宽400px,它的内容就会到400px自动换行,如果该行末端有个英文单词很长(congratulation等),它会把单词 ...