这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的。

题意:

有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服务器相连。对于每台服务器,你可以选择停止该台以及与这台服务器相连的服务器的一项服务。如果一台服务器的所有服务都被停止,则这台服务器瘫痪。问最多能使多少台服务器瘫痪

转化为数学模型(题目是如何抽象成这种数学模型的也要好好想想):

把n个集合尽可能多的分成若干组,使得每组所有集合的并集为全集。这里集合Pi表示服务器i以及与其相邻服务器的集合

算法:

数组P[i]表示服务器i以及与其相邻服务器的集合的二进制表示

枚举所有集合可能的组合情况,一共有2n种,计算其并集保存在cover中

f[S]表示子集S最多可以分成多少组

状态转移方程:

枚举S的子集S0

f[S] = max{f[S], f[S - S0] + 1 | 这里S0是S子集而且cover[S0]为全集}

这里再说一下枚举S0用代码实现的技巧:

在二进制中S0的1的个数肯定比S要少,所以从数值大小上来看S0 < S

我们先令S0 = S - 1

那么 S & (S0 - 1)就是S的子集了

因为上面的表达式满足两个条件:

  1. S0 < S
  2. S0的1的个数比S要少

S ^ S0的含义:

S ^ S0代表以S为全集S0的补集,为什么用异或运算实现呢?自己动手模拟一下就清楚了,嘿嘿

好了,写到这里,这道题就分析的很透彻了。看来位运算还是蛮有意思的

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = (1 << 16) + 10;
 9 int cover[maxn], p[20], f[maxn];
10
11 int main(void)
12 {
13     #ifdef LOCAL
14         freopen("11825in.txt", "r", stdin);
15     #endif
16
17     int n, kase = 0;
18     while(scanf("%d", &n) == 1 && n)
19     {
20         memset(f, 0, sizeof(f));
21         for(int i = 0; i < n; ++i)
22         {
23             int m, x;
24             scanf("%d", &m);
25             p[i] = (1 << i);
26             while(m--)
27             {
28                 scanf("%d", &x);
29                 p[i] |= (1 << x);
30             }
31         }
32
33         for(int i = 0; i < (1 << n); ++i)
34         {
35             cover[i] = 0;
36             for(int j = 0; j < n; ++j)
37             {
38                 if(i & (1 << j))
39                     cover[i] |= p[j];
40             }
41         }
42
43         f[0] = 0;
44         int all = (1 << n) - 1;
45         for(int s = 1; s < (1 << n); ++s)
46         {
47             f[s] = 0;
48             for(int s0 = s; s0; s0 = (s0 - 1) & s)
49                 if(cover[s0] == all)
50                     f[s] = max(f[s], f[s0 ^ s] + 1);
51         }
52
53         printf("Case %d: %d\n", ++kase, f[all]);
54     }
55     return 0;
56 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3910723.html

UVa 11825 (状压DP) Hackers' Crackdown相关推荐

  1. 状压DP UVA 10817 Headmaster's Headache

    题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][ ...

  2. 状压DP学习总结 (详解,适合没状压dp基础的人学习,还在更新中,,,,)

    本次博客,主要是给学弟学妹们讲解一下状压dp,不适合有基础的同学观看,可能会浪费时间,因为偏基础 先来最简单的一个吧   http://acm.hdu.edu.cn/showproblem.php?p ...

  3. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  6. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  7. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

最新文章

  1. Android测试分析3
  2. 2019牛客暑期多校训练营(第八场)
  3. 前端学习(1260):promise中的常见api对象方法
  4. 高性能滚动scroll(防抖和节流)
  5. 【JAVA】接口中的default和static方法
  6. 每天一个linux命令(13):tail 命令
  7. html+css基础-3-flex,浏览器内核,HTML5新特性
  8. 什么是java实例化?举例说明
  9. 光纤通信(邱昆、王晟版)课后答案
  10. python语言def_python中def的含义
  11. sql数据库中毒,扩展名被改为.supporthelpgood​,.666decrypt666​​​​​​,.xxxxx,.dom,勒索病毒加密该如何恢复数据
  12. 目标检测数据集PASCAL VOC详解
  13. cad怎么画立体图形教学_CAD画三维图中如何绘制三维实体
  14. AirDrop是什么?
  15. win7系统如何映射服务器,win7系统映射网络驱动器怎么访问
  16. android 网速刻度盘 自定义view二
  17. Javascript MVC —— View
  18. java 字节码操作图和JAVAssist库图
  19. 西门子200Smart加维纶触摸屏程序画面程序案例,项目内容为某制造企业疫苗车间控制系统,报告配液工艺
  20. 字符串经典匹配算法之Sunday算法

热门文章

  1. 【408预推免复习】计算机网络(谢希仁第七版)第一章——概述
  2. 对于插入和删除数据越频繁的操作 ,单链表较顺序存储结构效率越有优势
  3. html5 内嵌网页_HTML5与CSS3基础语法自学教程(二)
  4. 网络营销外包中那些超有效的网络营销方法有进一步了解过吗?
  5. 网站建设套用模板后该如何做到出类拔萃?
  6. 网站外链优化布局和新增技巧介绍!
  7. SEO站内优化细节不可少,教你4个小技巧!
  8. mysql 事件_区块链研究实验室 | 使用MySQL存储以太坊事件
  9. win10系统迁移后系统重装_Win10系统迁移教程
  10. c语言小学生算法,急求:C语言小学生算法练习软件实现的任务:面向小学生,随机选择两个整数进行加、减、乘、除,要求学生解答。设计内容:1、电...