UVA 11825 Hackers' Crackdown——dp

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/81903080
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int kase, n, a[20], un[1<<16], dp[1<<16];
int main() {
    while (~scanf("%d", &n) && n) {
        for (int i = 0; i < n; i++) a[i] = 0;
        for (int i = 0; i < (1<<n); i++) un[i] = 0;
        int m, x;
        for (int i = 0; i < n; i++) {
            a[i] |= (1<<i);
            scanf("%d", &m);
            for (int j = 0; j < m; j++) {
                scanf("%d", &x);
                a[i] |= (1<<x);
            }
        }
        for (int i = 0; i < (1<<n); i++) {
            for (int j = 0; j < n; j++) {
                if ((i>>j)&1) un[i] |= a[j];
            }
        }
        for (int S = 0; S < (1<<n); S++) {
            dp[S] = 0;
            for (int s = S; s; s = (s-1)&S) {
                if (un[s] == (1<<n)-1) dp[S] = max(dp[S], dp[S^s] + 1);
            }
        }
        printf("Case %d: %d\n", ++kase, dp[(1<<n)-1]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/81903080