[动态规划] 黑客的攻击 Hacker's CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集

#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

int n;
int P[1000],cover[1000],f[1000];

int main(){

	scanf("%d", &n);
	for (int i = 0; i < n;i++)
	{
		int m, x;
		scanf("%d", &m);
		P[i] == 1 << i;
		while (m--)
		{
			scanf("%d", &x);
			P[i] |= (1 << x);
		}
	}
	for (int S = 1; S < n;S++)
	{
		cover[S] = 0;
		for (int i = 0; i < n; i++){
			if (S&(1 << i)) cover[S] |= P[i];
		}
	}
	f[0] = 0;
	int ALL = (1 << n) - 1;
	for (int S = 1; S < n;S++)
	{
		f[S] = 0;
		for (int S0 = S; S0;S0=(S0 - 1) & S)
// 这是最关键的一部, 取子集操作
                {
			if (cover[S0]==ALL)
			{
				f[S] = max(f[S], f[S^S0] + 1);
//取出子集的补集+1与最大值比较
                        }
		}
	}
	printf("%d", f[ALL]);

	return 0;
}

[动态规划] 黑客的攻击 Hacker's CrackDown Uva 11825

时间: 2024-10-20 02:30:22

[动态规划] 黑客的攻击 Hacker's CrackDown Uva 11825的相关文章

Hackers&#39; Crackdown UVA - 11825

明早更新. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<stdio.h> #include<stdlib.h> #define MAXN 20 using namespace std; int n,m; int dp[1<<MAXN],cover[1<<MAXN],p[MAXN]; void cl(){ memset(p,0,s

Hackers&#39; Crackdown UVA - 11825 (状压dp)

给出n个电脑,每个电脑连着n个服务,然后每个电脑都连着m个邻电脑,如果当前的电脑某个服务被断开了,相邻的电脑的服务也会被断开,每个电脑都只能操作一次,问你最多可以让多少种服务被断开.一种服务被断开的条件就是存在一个破坏第i个电脑的集合,这个集合扩散出去的集合是全集(......语文真的是......讲不出来) 先把每个电脑和邻电脑的状态记录下来,把这个看成一个集合,然后那么我现在的问题就变成了用一些电脑的集合并起来使他变成全集. 现在把n个电脑的可能状态全部枚举出来,然后看当前这些电脑最多可以影

uva 11825 ,Hacker&#39;s Crackdown 状态压缩 dp

// uva 11825 Hacker's Crackdown // // 题目意思看了很久才看懂,有n台计算机,有n种服务,每台计算机上运行所有 // 的服务,并且其中有的计算机与某些计算机相互邻接,对于每台计算机, // 你可以选择一项服务,停止这项服务,则与它邻接的计算机的该服务也停止了 // 你的目的是让经量多的服务完全瘫痪 // // 换而言之,这个问题就是在n个集合中(p[1]....p[n])分成尽量多的组数,使得每组 // 的并集等于全集(即所有的n台电脑都停止)... // /

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

Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed computer system which is a prime target for hackers. The system is basically a set of N computer nodes with each of them running a set of Nservices. Note

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

题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪(没有计算机有该项服务). 思路:(见大白70页,我的方程与大白不同) 把n个集合P1.P2.Pn分成尽量多的组,使得每组中全部集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中全部集合的并集,dp[s]表示子集s最多能够分成多少组,则 假设co

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

题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有相同的n种服务),对每台计算机,你可以选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让更多的服务瘫痪(没有计算机有该项服务). 思路:(见大白70页,我的方程与大白不同) 把n个集合P1.P2.Pn分成尽量多的组,使得每组中所有集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中所有集合的并集,dp[s]表示子集s最多可以分成多少组,则 如果cove

uva 11825 Hackers&#39; Crackdown(状态压缩DP)

Hackers' Crackdown Input: Standard Input Output: Standard Output   Miracle Corporations has a number of system services running in a distributed computer system which is a prime target for hackers. The system is basically a set of N computer nodes wi

题解 $UVA$ 11825【$Hackers$&#39; $Crackdown$】

本题的数学模型是:把\(\mathcal{n}\)个集合\(\mathcal{P1,P2,...,Pn}\)分成尽量多组,使得每组中所以集合的并集等于全集.这里集合\(\mathcal{Pi}\)就是计算机\(\mathcal{i}\)及其相邻计算机的集合,每组对应于题目中的一项服务. 注意到\(\mathcal{n}\)很小,可以套用<算法竞赛>里面提到的二进制法表示这些集合,即在代码中, 每个集合\(\mathcal{Pi}\)实际上是一个非负整数.输入部分代码如下: for(int i=

UVA - 11825 —— Hackers&#39; Crackdown

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18913 这道题是一道状态压缩DP的好题,有几点要注意的: 1.uva给出的题目不知道为何,题意是有些描述不清的,详见<训练指南> 2.这道题可以有很多写法,整个的dp求解和cover那个部分既可以写成记忆化搜索自顶向下,也可以自底向上来实现. #include <cstdio> #include <iostream> #include <