UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集

ACM

题目地址:

option=com_onlinejudge&Itemid=8&page=show_problem&problem=2925" style="color:rgb(0,136,204); text-decoration:none">11825 - Hackers' Crackdown

题意: 

有一个由编号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)

參考了凌乱的心巨巨的题解,嘛。是为了了解枚举子集做的题目。

枚举子集的模板:

  1. // 对于集合S
  2. for (int S0 = S; S0; S0 = S&(S0 - 1)) // 枚举S0为子集
  3. ...

原理: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;
}

最新文章

  1. Hive安装部署
  2. ASP中Lable控件的定位问题
  3. 《JS设计模式笔记》 3,观察者模式
  4. C#系列——记一次业务需求:对象的深拷贝
  5. ResourceManager里面Trackingui需要手动该ip
  6. Mac下使用firefoxdriver
  7. MFC字符串转化成16进制
  8. c#操作IIS站点
  9. HDU2521反素数
  10. DotNET 开发常用工具汇集
  11. java与.net平台之间进行RSA加密验证
  12. Android 网络通信框架Volley简介(Google IO 2013)
  13. NOIP2012模拟试题【圆圈舞蹈( circle)
  14. hdu 4741 Save Labman No.004(2013杭州网络赛)
  15. webservice接口调用存储过程返回失败
  16. Android --- 读取系统资源函数getResources()小结
  17. Spring-boot使用eclipse搭建项目(一)
  18. Android学习笔记-事件处理
  19. 面向连接的TCP概述
  20. [openjudge-贪心]装箱问题

热门文章

  1. codevs——T2488 绿豆蛙的归宿
  2. what&amp;#39;s new in vc2015
  3. OC的动态继承编译机制
  4. Java多线程之~~~线程安全容器的非堵塞容器
  5. SVG 贝塞尔曲线控制【方便设置】:贝塞尔曲线
  6. etxjs
  7. 细数SuperComputer最新排名和常见Benchmark类型
  8. 百度编辑器UEditor修改成支持物理路径
  9. hiho 171周 - 水题,并查集
  10. Rx = Observables + LINQ + Schedulers