UVA - 11825 Hackers' Crackdown 状态压缩

来源:互联网 发布:java replace 编辑:程序博客网 时间:2024/05/29 18:40

题目大意:有n台电脑,有n种服务,每台计算机上都运行着这n中服务。你是一名黑客,对于每台计算机,你可以选择一种服务,终止这台计算机和所有与他相邻计算机的该项服务,问最多能终止多少种服务

解题思路:用一个数组先将所有相邻的计算机记录,用“|”运算符记录相邻的计算机,然后再用另一个数组统计一下关闭计算机的所有情况并记录,最后再枚举关闭计算机的所有情况能关闭多少种服务

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 20int A[maxn], cover[1 << maxn], dp[1<<maxn];int main() {int n, m, x, mark = 1;while(scanf("%d",&n) == 1 && n) {for(int i = 0; i < n; i++) {scanf("%d",&m);A[i] = (1 << i);while(m--) {scanf("%d",&x);A[i] |= (1 << x);}}for(int i = 0; i < (1 << n); i++) {cover[i] = 0;for(int j = 0; j < n; j++)if((1 << j) & i)cover[i] |= A[j];}int ALL = (1 << n) - 1;for(int i = 0; i < (1 << n); i++) {dp[i] = 0;for(int j = i; j ; j = (j - 1) & i) if(cover[j] == ALL)dp[i] = max(dp[i],dp[i^j] + 1);}printf("Case %d: %d\n",mark++, dp[ALL]);}return 0;}


0 0