https://vjudge.net/problem/UVA-11825

题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务器的某个服务时,与他相邻的服务器上的同种的服务也会被攻击,当某种服务在所有的服务器上都不再运行时,我们称消灭了一种服务,求黑客最多消灭几种服务。

n最大16,我们容易想到利用二进制表示已经攻击过的电脑,f(S)=MAX{f(S),f(S0^S)+1 | if(S0是S的子集&&S0攻击后可以覆盖全部的电脑)}

接下来的问题是如何判断某个电脑集合可以攻击到的范围,我们不妨用P[i]表示攻击第i个电脑后受到影响的所有电脑的集合,cover[i]表示攻击i集合里的全部电脑后受到影响的所有电脑的集合。对于子集的枚举有一种巧妙地方法:

for(int S0=S;S0;S0=(S0-1)&S);   //其中,S表示原集合,S0为他的子集

当上面的问题都解决之后就好办了,

 #include<bits/stdc++.h>
using namespace std;
int P[],cover[<<],f[<<];
int main()
{
int N,m,i,j,k=,x;
while(cin>>N&&N){
memset(P,,sizeof(P));
memset(cover,,sizeof(cover));
memset(f,,sizeof(f));
for(i=;i<N;++i)
{
P[i]|=(<<i);
scanf("%d",&m);
while(m--){
scanf("%d",&x);
P[i]|=(<<x);
}
}
for(i=;i<(<<N);++i)
{
for(j=;j<N;++j)
if(i&(<<j)) cover[i]|=P[j];
}
for(i=;i<(<<N);++i)
{
for(int S=i;S;S=(S-)&i)
if(cover[S]==(<<N)-&&f[i]<f[i^S]+)
f[i]=f[i^S]+;
}
printf("Case %d: %d\n",++k,f[(<<N)-]);
}
return ;
}

uva 11825 巧妙地子集枚举方法的更多相关文章

  1. UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  2. uva 11825 Hackers&#39; Crackdown (状压dp,子集枚举)

    题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪( ...

  3. UVA 11825 - Hackers&#39; Crackdown 状态压缩 dp 枚举子集

    UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集 ACM 题目地址:option=com_onlinejudge&Itemid=8&page=sh ...

  4. UVA 1508 - Equipment 状态压缩 枚举子集 dfs

    UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...

  5. UVA.12716 GCD XOR (暴力枚举 数论GCD)

    UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...

  6. iOS 开发--NSMutableArray使用枚举方法

    可变数组也可以使用枚举方法, 我们在这里提供了两种枚举方法, 一个是正序枚举, 一个是倒序枚举, 在正序枚举中, 元素的个数和顺序都是不可以修改的, 但是在倒序枚举中却可以修改, 这有些耐人寻味. 涉 ...

  7. 【最小生成树+子集枚举】Uva1151 Buy or Build

    Description 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q< ...

  8. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

    题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...

  9. UVA 11825 Hackers’ Crackdown(集合动态规划 子集枚举)

    Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...

随机推荐

  1. HTTP Keep-Alive是什么?如何工作?(转)

    add by zhj: 本篇只是Keep-Alive的第一篇,其它文章参见下面的列表. 原文: HTTP Keep-Alive是什么?如何工作? 1. HTTP Keep-Alive是什么?如何工作? ...

  2. AngularJS 笔记之创建服务方式比较 : factory vs service vs provider 。

    首先说一下服务这个东西是用来干嘛的.很多时候我们把太多的数据和逻辑都一股脑儿地往 controller 里放.这样我们的 controller 原来越臃肿.从它们的生命周期可以发现,其实 contro ...

  3. React:快速上手(4)——掌握Redux(1)

    React:快速上手(4)——掌握Redux 引入Redux 混乱的state管理 随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状 ...

  4. JAVA寄存器

    所有进程都使用寄存器,Java虚拟机使用下列寄存器管理系统堆栈:    程序记数寄存器:跟踪程序执行的准确位置    堆栈指针寄存器:指示操作栈项    框架寄存器:指向当前执行的环境    变量寄存 ...

  5. PL/SQL编程—分页功能(存储过程)

    SQL),bookname ),publish )); Table created SQL> SQL> create or replace procedure sp_add_book(bo ...

  6. udev和mdev hotplug事件

    关于udev和mdev之间的区别与联系我发现自己现在还没有把它完整的给区分开来和联系起来. 设备文件系统有devfs,mdev,udev mdev是udev的简化版本,是busybox中所带的程序,最 ...

  7. 【JavaScript】撞墙的小球

    参考: 1.JS 元素位置 设置元素位置:http://blog.sina.com.cn/s/blog_a2ec891e01011v9f.html 2.用JavaScript修改CSS属性 3.使用J ...

  8. maven私服客户端配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  9. 在U盘上安装Damn Small Linux

    Damn Small Linux 是一个袖珍Linux发行版,整个系统只有50M左右,所以可以放到U盘中,从而可以在支持U盘启动的电脑上使用Linux,功能与LiveCD相当.   有很多种方法可以将 ...

  10. Java:执行jar文件命令

    Java:执行jar文件命令 执行jar文件命令: java -jar test.jar win7系统切换目录命令: cd /d d:/test