UVA11825 Hacker's Crackdown 二进制集合+关于子集的动态规划
题意:有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 二进制集合+关于子集的动态规划的更多相关文章
- 算法笔记-- 二进制集合枚举子集 && 求子集和 && 求父集和
枚举子集: 复杂度:O(2^k) )&s); 用sos dp求解子集和以及父集和 子集和: ; i <= k; i--) { ; mask < (<<k); mask+ ...
- python 实现求一个集合的子集
概要 今天偶然看到有个关于数学中集合的问题,就突发奇想的想用python实现下求一个集合的子集. 准备 我当然先要复习下,什么是集合,什么是子集? 比较粗犷的讲法,集合就是一堆确定的东西,细致一点的讲 ...
- [python语法]python中如何判断一个集合是另一个集合的子集?
问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...
- 59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()
判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与is ...
- UVA 11825 Hackers’ Crackdown(集合动态规划 子集枚举)
Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...
- 【状压DP】【UVA11825】 Hackers' Crackdown
传送门 Description 你是一个hacker,侵入了一个有着n台计算机(编号为1.2.3....n)的网络.一共有n种服务,每台计算机都运行着所有服务.对于每台计算机,你都可以选择一项服务,终 ...
- LeetCode 78,面试常用小技巧,通过二进制获得所有子集
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第47篇文章,我们一起来看下LeetCode的第78题Subsets(子集). 这题的官方难度是Medium,点赞 ...
- C#中判断一个集合是另外一个集合的子集
有这样的两个集合: string[] bigArr = new string[] { "a", "b", "c" };string[] sm ...
- 78. Subsets(中等,集合的子集,经典问题 DFS)
Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...
随机推荐
- Java学习笔记--继承和多态(上)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- jQuery获取url
JS获取当前页面的URL信息 设置或获取对象指定的文件名或路径. <script> alert(window.location.pathname) </script> 设置或获 ...
- android中开启线程
其实Android启动线程和JAVA一样有两种方式,一种是直接Thread类的start方法,也就是一般写一个自己的类来继承Thread类.另外一种方式其实和这个差不多啊! 那就是Runnable接口 ...
- echarts折线图相关
optionJKDLine = { title: { text: '告警数量趋势图', textStyle:{ //标题样式 fontStyle:'normal', fontFamily:'sans- ...
- Android 在已有工程中实现微信图片压缩
这个我们需要自己去编译,但是已经有人帮我们编译好了,压缩算法也已经实现,因此,我们去下载然后编译即可:https://github.com/bither/bither-android-lib 首先将上 ...
- System Center Configuration Manager 2016 必要条件准备篇(Part1)
步骤4.创建系统管理容器 SCCM 2016 配置管理系列(Part 1- 4) 介绍AD01上配置了Active Directory域服务(ADDS),然后将Configuration Manag ...
- 使用CreateProcess函数运行其他程序
为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建一个运行相应程序的进程.其函数原型如下.CreateProcess(appName, co ...
- 域名设置A记录或CNAME记录,但无法被解析,可能是因为状态为:clientHold
解决方案: 访问https://whois.aliyun.com/查询域名状态是否为“注册商禁止解析”: 若是,联系注册商根据对方要求进行操作以便解除. https://icann.org/epp#c ...
- 使用Eclipse连接SAP云平台上的HANA数据库实例
SAP云平台(Cloud Platform)上的HANA数据库实例有两种方式访问: 1. 通过SAP云平台的基于网页版的Development Tool:SAP HANA Web-Based Deve ...
- IOS PickerView使用
- (void)viewDidLoad { [super viewDidLoad]; // 1.创建pickerview // pickerview有默认的frame UIPickerView *pi ...