UVA 11825 Hackers' Crackdown

原创 2016年08月29日 22:17:30

题目链接:http://acm.hust.edu.cn/vjudge/problem/18913


题意:假设你是一个黑客,侵入了n台计算机,一共有n种服务,每台计算机都运行着所有的服务。对于每台计算机,你可以选择一项服务,终止这台计算机和它相邻计算机的该服务。求最多可以使得多少服务全部停止。


思路:如果停止掉一个服务,也就是选择一个计算机集合,使得每台和它相邻的计算机能够构成全集。可以用状态压缩dp解决,先预处理出每个集合影响的范围能否构成全集。

然后对于每个集合S,枚举S的子集S'  dp[S] = max( dp[S'] + dp[S-S'] , dp[S] )。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007

const int maxn = 1<<16;
int a[20];
int s[maxn];
bool can[maxn+10];
int dp[maxn+10];
int n,uplim;

void init()
{
    int m,temp;
    uplim = (1<<n) - 1;
    rep(i,1,n)
    {
        a[i] = 1<<(i-1);
        scanf("%d",&m);
        rep(j,1,m)
        {
            scanf("%d",&temp);
            a[i] |= 1<<temp;
        }
    }
}

int solve()
{
    Clean(can,false);
    rep(i,1,uplim)
    {
        s[i] = 0;
        rep(j,0,n-1)
        if ( i & (1<<j) )
            s[i] |= a[j+1];
    }
    rep(i,1,uplim)
    {
        can[i] = s[i] == uplim;
        for ( int j = (i - 1) & i; j; j = (j - 1) & i )
            can[i] = ( s[j] | s[i-j] ) == uplim;
        if ( can[i] )
            dp[i] = 1;
        else dp[i] = 0;
    }
    rep(i,1,uplim)
    {
        for ( int j = (i - 1) & i; j; j = (j - 1) & i )
            dp[i] = max( dp[i] , dp[j] + dp[i-j] );
    }
    return dp[uplim];
}
int main()
{
    int kase = 0;
    while(cin>>n)
    {
        if ( !n ) break;
        init();
        printf("Case %d: %d\n",++kase,solve());
    }
    return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 11825 Hackers' Crackdown

数学模型:每个集合含0,1...n-1中的若干个元素。把n个已知集合分成尽量多组,使得每一组中集合的并都等于全集(已知的n个元素) 1.集合运算的总结(参见另一篇博文) 2.符号表示: p[i]:第...
  • u013514182
  • u013514182
  • 2014年12月24日 22:21
  • 160

UVA - 11825 Hackers' Crackdown

题意: 假设你是一个黑客,入侵了一个有着n台计算机的网络(0,1,...n-1),一共有n种服务 每台计算机都运行着所有的业务,对于每台计算机,你都可以选择一项服务,终止这台计算机和所有与它相连的计...
  • u011345136
  • u011345136
  • 2013年12月05日 12:28
  • 521

uva 11825 - Hackers' Crackdown

题目:uva 11825 - Hackers' Crackdown 思路:状态压缩 #include #include #include #include #include ...
  • shiyuankongbu
  • shiyuankongbu
  • 2013年09月20日 12:46
  • 1135

UVa 11825 Hackers’ Crackdown

参照大白书上面的解法,总共三个步骤,前两个步骤都较好理解。P[i]是用位表示的当选中i时,总共有0~n-1总共有多少个数字被覆盖。cover[S]则表示,当子集为S时,0~n-1中能够被覆盖的位数。若...
  • u011915301
  • u011915301
  • 2015年04月06日 19:57
  • 581

UVA 11825 Hackers' Crackdown

题目 Miracle Corporations has a number of system services running in a distributed computer system wh...
  • Druning
  • Druning
  • 2016年05月08日 18:28
  • 353

Uva 11825 - Hackers' Crackdown 状态压缩

Problem H Hackers’ Crackdown  Input: Standard Input Output: Standard Output   Miracle Corpora...
  • cyendra
  • cyendra
  • 2013年06月03日 10:42
  • 655

【动态规划】[UVa 11825]Hackers' Crackdown

这道题目用DP来搞首先题目可以看成把所有的计算机分成很多组每一组的都关闭同一种服务,同时这一组的关闭能够关闭所有的计算机,那么另SS为当前的所有计算机的集合另S0S_0为SS的子集另全集(所有计算机)...
  • JeremyGJY
  • JeremyGJY
  • 2015年07月15日 17:34
  • 254

UVA - 11825 Hackers' Crackdown 状态压缩

题目大意:有n台电脑,有n种服务,每台计算机上都运行着这n中服务。你是一名黑客,对于每台计算机,你可以选择一种服务,终止这台计算机和所有与他相邻计算机的该项服务,问最多能终止多少种服务 解题思路:用...
  • L123012013048
  • L123012013048
  • 2015年02月27日 09:14
  • 314

uva 11825 - Hackers' Crackdown dp

题意   有n个节点,每个节点有m_i个邻居,每个人和邻居为一个整体,问最多可以分成几组使得每组并集合为全集 转移方程 复杂度 3^n /* author:jxy lang:C/C++ u...
  • czjxy881
  • czjxy881
  • 2014年01月28日 16:48
  • 1126

UVA 11825 Hackers' Crackdown (dp)

不得不服刘老师的过人之处,对dp的理解也是非常深。虽然最后的时间复杂度不知道怎么算出来的。 cover[i]=j i是选择那几台电脑,j是能覆盖那几台电脑。p[i]=j  i代表i这台电脑 j代表i...
  • clx55555
  • clx55555
  • 2017年08月10日 09:48
  • 85
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 11825 Hackers' Crackdown
举报原因:
原因补充:

(最多只允许输入30个字)