uvaoj 11825 - Hackers' Crackdown

来源:互联网 发布:软件培训周末班 编辑:程序博客网 时间:2024/06/07 02:27

题解:
1.状态压缩动态规划,f(s) = max(f(s - s0) & s0 覆盖全局) + 1;
总结:
1.这个题目没有自己想出来,因为没有把握好解题的方法,其实并不是非常难。动态规划的题目首先应该简单的尝试写一下转移方程,也许后面就可以豁然开朗了
2.学习到了枚举某个集合的所有子集,以后学习新的知识,应该首先自己尝试简单的思考,再去看答案,这样可以吸收更多一些

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define MAXN 20int p[MAXN],s[1 << MAXN],f[1 << MAXN];int main(){    int n,m,cur,kcas = 0;    while(cin >> n && n)    {        for(int i = 0;i < n;i++)        {           cin >> m;           p[i] = (1 << i);           while(m--)           {               cin >> cur;               p[i] |= (1 << cur);           }        }        memset(s,0,sizeof(s));        for(int i = 1;i < (1 << n);i++)            for(int j = 0;j < n;j++)if(i >> j & 1)                s[i] |= p[j];        memset(f,0,sizeof(f));        for(int i = 1;i < (1 << n);i++)            for(int j = i;j;j = ((j - 1) & i))                if(s[j] + 1 == (1 << n))                    f[i] = max(f[i],f[j ^ i] + 1);        printf("Case %d: %d\n",++kcas,f[(1 << n) - 1]);    }}
0 0