题目链接Click Here

【题目描述】

假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络。一共有\(n\)种服务,每台计算机都运行着所有服务。对于每台计算机,你都可以选择一项服务,终止这台计算机和所有与它相邻计算机的该项服务(如果其中一些服务已经停止,那他们继续保持停止状态)。你的目标是让尽量多的服务完全瘫痪(即:没有任何计算及运行着该服务)

【输入格式】

输入包含多组数据,每组数据的第一行为整数\(n(1<=n<=16)\):以下\(n\)行每行描述一台计算机相邻的计算机,其中第一个数\(m\)为相邻计算机个数,接下来的\(m\)个整数为这些计算机的编号。输入结束标志\(n=0\)。

【输出格式】

对于每组数据,输出完全瘫痪的服务的数量。


本题实际上可以转化为:给你\(n\)个集合\(p_{1 -> n}\),你要把它们分成尽可能多的组,每个组内所有集合的并等于全集。

因为\(n\)比较小,所以我们可以把每个集合\(P\)(每个点自身\(+\)它相邻的点)二进制状压。考虑选取一些集合时,把选取的集合也二进制状压(表示为\(S\)),存一下该选取状态下可以覆盖的状况即可(\(cover_s\))。

这样我们可以得到方程:

\[f(S) = max (f(S - S_0)|S_0∈S, cover_{S_0} = S_{All})
\]

技巧:二进制下的子集枚举:

for (int S0 = S; S0 != 0; S0 = (S0 - 1) & S)

这样为什么能实现子集枚举呢?请读者自行思考(笑

复杂度:\(O(\sum_{k=1->N}C(n, k) * 2 ^ n) = O(3 ^ n)\)。为什么等于后面我不会二项式定理所以不大会。

关注点:本题中的子集枚举思想。

#include <bits/stdc++.h>
using namespace std; const int N = 20; int Case, n, m, to, s[N], f[N], cho[1 << N]; int main () {
// freopen ("data.in", "r", stdin);
while (cin >> n && n) {
for (int i = 0; i < n; ++i) {
cin >> m; s[i] = 1 << i;
for (int j = 0; j < m; ++j) {
cin >> to; s[i] |= 1 << to;
}
// cout << "s[" << i << "] = " << s[i] << endl;
}
const int All = (1 << n) - 1;
for (int i = 0; i < 1 << n; ++i) {
cho[i] = 0;
for (int k = 0; k < n; ++k) {
if ((i >> k) & 1) {
cho[i] |= s[k];
}
}
}
f[0] = 0;
for (int S = 1; S < (1 << n); ++S) {
f[S] = 0;
for (int S0 = S; S0; S0 = (S0 - 1) & S) { //枚举S的子集
if (cho[S0] == All) {
f[S] = max (f[S], f[S ^ S0] + 1);
}
}
}
cout << "Case " << ++Case << ": " << f[All] << endl;
}
}

UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举的更多相关文章

  1. UVa 11825 Hackers' Crackdown (状压DP)

    题意:给定 n 个计算机的一个关系图,你可以停止每台计算机的一项服务,并且和该计算机相邻的计算机也会终止,问你最多能终止多少服务. 析:这个题意思就是说把 n 台计算机尽可能多的分成一些组,使得每组的 ...

  2. [UVA11825]Hackers' Crackdown(状压dp)

    题解降智警告 吐槽降智警告 思路降智警告 代码降智警告 题目传送门 洛谷 果然水题做多了连半道难点的都能给咱干蒙... 水题做多了降智  --鲁迅 题目大意:见传送门 心路历程见末尾 正解(大概): ...

  3. UVA 11825 Hackers’ Crackdown 状压DP枚举子集势

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

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

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

  5. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  6. 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)

    洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...

  7. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

  8. BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作

    #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...

  9. bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制

    比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...

随机推荐

  1. 一看就能学会的H5视频推流方案

    本文由云+社区发表 作者:周超 导语 随着直播平台爆发式增长,直播平台从 PC 端转战移动端,紧跟着直播的潮流,自己学习实现了一套简单的 H5 视频推流的解决方案,下面就给小伙伴们分享一下自己学习过程 ...

  2. 第七课 路径与列表 html5学习2

    1.路径 一.相对路径1.同级路径2.下级路径 /3.上级路径 ../上一级路径 ../../上两级二.绝对路径 2.列表 列表特点;整齐.整洁.有序 一.无序列表语法格式<ul> < ...

  3. OpenCV尝试

    我们来尝试,使用OpenCV来读入本地的一张图片,并使用库函数将其水平翻转.垂直翻转以及边缘提取,后将结果文件存入本地. 工具:VS2017  OpenCV4.0.1 怎么配置opencv/报错怎么办 ...

  4. 深入浅出KNN算法(一) KNN算法原理

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...

  5. 字符串转数字练习--String to Integer (atoi)

    Implement atoi which converts a string to an integer. The function first discards as many whitespace ...

  6. mysql解压包安装教程

    1.下载压缩包,地址1(官网下载):https://www.mysql.com/downloads/   地址2(百度网盘):https://pan.baidu.com/s/12lnpcr3thBe9 ...

  7. 求出100以内的素数(java实现)

    j package test1; //2018/11/30 //求100以内的所有素数 public class Main10 { public static void main(String[] a ...

  8. ajax实现用户登陆,退出,java做后端

    最近http老师布置了个任务,用cookie完成登陆,退出.Http老师讲的是node.js写后端,由于自己还是擅长java些,还是用Java做了. 以前跟着教程写过一个网站,当初是用jsp+serv ...

  9. [十二省联考2019]D1T2字符串问题

    嘟嘟嘟 省选Day1真是重大失误,T2连暴力都没时间写. 上周五重新答了遍Day1,竟然搞了187分吼吼吼吼. T2按40分写的暴力,结果竟然得了60分. 稍微说一下暴力吧:预处理哈希,对于一组支配关 ...

  10. nextInt()和nextLine()一起使用时的注意点

    问题原因:nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下 ...