zoukankan      html  css  js  c++  java
  • UVA11825 Hackers' Crackdown

    题意:有n台计算机(n<=16),每一台有n个服务,告诉每台电脑相连的电脑,关掉一台电脑的某个的服务也会关掉与他相连的电脑的同一个服务,每台电脑只能选择一个服务关闭,没有电脑运行这个服务,那么这个服务就瘫痪,问最多能使几个服务瘫痪

    题解:首先n很小,可以想到是状态压缩,关一个电脑可以关掉与它相连的电脑,那么应该尽量少用电脑使得这些电脑加上相连的电脑的并集是全部电脑,把每一台电脑和其相连的作为一个集合的元素如:n=3,1连2,那么可以用一个数表示二进制是011,设dp[s]代表s最多能形成几个全集,然后就是枚举子集dp

    #include <bits/stdc++.h>
    #define ll long long
    #define maxn (1<<16)+5
    using namespace std;
    int n, m, t, s[maxn], p[maxn], dp[maxn], num=1;
    void init(){
        for(int i=0;i<(1<<n);i++)
            for(int j=0;j<n;j++)
                if(i&(1<<j)) s[i] |= p[j];
    }
    int main(){
        while(~scanf("%d", &n)&&n){
            memset(dp, 0, sizeof(dp));
            memset(p, 0, sizeof(p));
            memset(s, 0, sizeof(s));
            for(int i=0;i<n;i++){
                scanf("%d", &m);
                p[i] = 1<<i;
                while(m--) scanf("%d", &t),p[i] |= (1<<t);
            }
            init();
            int all = (1<<n)-1;
            for(int i=0;i<(1<<n);i++){
                for(int j=i;j;j=(j-1)&i)
                    if(s[j] == all)
                    dp[i] = max(dp[i], dp[i^j]+1);
            }
            printf("Case %d: %d
    ", num++, dp[all]);
        }
        return 0;
    }
  • 相关阅读:
    天心阁漫步
    大美湘江
    easyui tree基本操作
    盗墓笔记
    半年了
    文件上传控件值发生变化后自动提交表单
    宁静的夏夜
    今天您给别人让座,将来别人给您让座
    优先队列priority_queue 用法详解
    POJ2387
  • 原文地址:https://www.cnblogs.com/Noevon/p/7449186.html
Copyright © 2011-2022 走看看