题意:有N台服务器,全部服务器都直接运行着完全相同的N个任务。对于每台电脑,你都可以进行“一次”操作,使得某(自己选定)一种任务停止,且同时会使得其他和这台服务器直接相连的电脑上面相同的服务完全终止。问题是:能够使得几种不同的任务完全消失在这N个服务器当中。

数学模型:选择若干个给定的子集,最多可以将全集覆盖多少次。

首先,使用整数来表示不同的集合,理由是正好对应了,1,0两种不同的数值,也可以分别对应选取和不选两种不同的状态。

因而,此处首先使用整数来代指选了的电脑的集合——010代表选择1号机器其十进制值是2.

因而,我们可以进行强行穷举:设DP[I]选择I代表的集合可以得到的最覆盖次数。可以得到一个性质,如果DP[I]的值不为0,就意味着集合I至少覆盖了全集一次,否则应当认为,其不构成全集一次。

于是,枚举所有能够构成全集的子集和,认为,当前状态应当为,至少构成了一次的全集的子集的补集的DP值+1,从中找到一个最大的。

自己也被绕进去了。。GG看代码吧

#include<bits/stdc++.h>
using namespace std; const long long MAXN=;
long long f[MAXN];
long long cover[MAXN];
long long p[];
int n,ans; void init()
{
// memset(f,0,sizeof(f));
for(int i=;i<n;++i)
{
p[i]=(<<i);
int x,m;
cin>>m;
while(m--)
{
cin>>x;
p[i]|=(<<x);
}
}
int limit=<<n;
for(int s=;s<limit;++s)
{
cover[s]=;
f[s]=;
for(int j=;j<n;++j)
{
if(s&(<<j))cover[s]|=p[j];
}
}
f[]=;
long long ALL=(<<n)-;
for(int s=;s<limit;++s)
{
for(int ss=s;ss;ss=(ss-)&s)
if(cover[ss]==ALL)f[s]=max(f[s],f[ss^s]+);
}
ans=f[ALL];
} int main()
{
cin.sync_with_stdio(false);
long long kk=;
while(cin>>n&&n)
{
init();
cout<<"Case "<<kk++<<": "<<ans<<endl;
} return ;
}

UVA11825 Hacker's Crackdown 二进制集合+关于子集的动态规划的更多相关文章

  1. 算法笔记-- 二进制集合枚举子集 && 求子集和 && 求父集和

    枚举子集: 复杂度:O(2^k) )&s); 用sos dp求解子集和以及父集和 子集和: ; i <= k; i--) { ; mask < (<<k); mask+ ...

  2. python 实现求一个集合的子集

    概要 今天偶然看到有个关于数学中集合的问题,就突发奇想的想用python实现下求一个集合的子集. 准备 我当然先要复习下,什么是集合,什么是子集? 比较粗犷的讲法,集合就是一堆确定的东西,细致一点的讲 ...

  3. [python语法]python中如何判断一个集合是另一个集合的子集?

    问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...

  4. 59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()

    判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与is ...

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

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

  6. 【状压DP】【UVA11825】 Hackers' Crackdown

    传送门 Description 你是一个hacker,侵入了一个有着n台计算机(编号为1.2.3....n)的网络.一共有n种服务,每台计算机都运行着所有服务.对于每台计算机,你都可以选择一项服务,终 ...

  7. LeetCode 78,面试常用小技巧,通过二进制获得所有子集

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第47篇文章,我们一起来看下LeetCode的第78题Subsets(子集). 这题的官方难度是Medium,点赞 ...

  8. C#中判断一个集合是另外一个集合的子集

    有这样的两个集合: string[] bigArr = new string[] { "a", "b", "c" };string[] sm ...

  9. 78. Subsets(中等,集合的子集,经典问题 DFS)

    Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...

随机推荐

  1. KBEngine warring项目源码阅读(一) 项目简介和注册

    首先介绍下warring项目,是kbe自带的一个演示示例,大部分人了解kbe引擎也是从warring项目开始的. 项目地址:https://github.com/kbengine/kbengine_u ...

  2. 常用模块random,time,os,sys,序列化模块

    一丶random模块 取随机数的模块 #导入random模块 import random #取随机小数: r = random.random() #取大于零且小于一之间的小数 print(r) #0. ...

  3. Winform 读取 指定\另一个\其他\任意 配置文件

    ExeConfigurationFileMap map = new ExeConfigurationFileMap();            map.ExeConfigFilename = @&qu ...

  4. EF中Entity SQL用法

    public List<policecase> GetPoliceCaseList(PoliceCaseFilter view)        {            string sq ...

  5. 实战:ADFS3.0单点登录系列-集成SharePoint

    这是本系列第四篇了,终于轮到SharePoint上场了,但是本文不会过多讲解SharePoint安装等话题,而是直入主题,讲解如何进行配置,让其于ADFS配合完成SSO的工作. 注意:本文使用的Sha ...

  6. 本人常用的Phpstorm快捷键

    我设置的是eclipse的按键风格(按键习惯),不是phpstorm的风格 1.添加TODO(这个不是快捷键)://TODO 后面是说明,换行写实现代码 2.选择相同单词做一次性修改:Alt+J+鼠标 ...

  7. html代码能让网页的横向滚动条默认居中

    在body 中加入 onload="window.scrollTo((document.body.scrollWidth-document.body.offsetWidth)/2,0)&qu ...

  8. JavaScript_HTML DEMO_1_概念

    HTML DOM - 文档对象模型 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). 1. 通过可编程的对象模型,JavaScript获得了足够的能力来创 ...

  9. 访问mongo数据库报错

    It looks like you are trying to access MongoDB over HTTP on the native driver port. 出错原因: 1.没有安装mong ...

  10. NSAutoreleasePool & thread

    https://developer.apple.com/documentation/foundation/nsautoreleasepool An object that supports Cocoa ...