【UVA】11825 Hackers' Crackdown(状压dp)

题目

传送门:QWQ

分析

$ n<= 16 $ 显然是状压

然后搞一搞(靠着蓝书yy一下)

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=17;
int n, P[maxn], cover[1<<maxn], f[1<<maxn]; 
int main(){
    int kase=0;
    while(scanf("%d",&n)==1 && 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=0;S<(1<<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<(1<<n);S++){
            f[S]=0;
            for(int S0=0;S0;S0=(S0-1)&S){
                if(cover[S0]==All) f[S]=max(f[S],f[S^S0]+1);
            }
        }
        printf("Case %d: %d\n",++kase,f[All]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/noblex/p/9228288.html
今日推荐