比赛 状态压缩DP练习 评测结果 AAAAAAAAAA
题目名称 安排公牛 最终得分 100
用户昵称 梦那边的美好ET 运行时间 0.190 s
代码语言 C++ 内存使用 21.66 MiB
提交时间 2019-05-28 19:39:47
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,a[21],f[1<<21],ans;
int count(int x){int s=0;while(x>0)++s,x-=(x&(-x));return s;}
int main(){
    freopen("examnine.in","r",stdin);
    freopen("examnine.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1,x,p;i<=n;++i){
        scanf("%d",&p);
        for(int j=1;j<=p;++j)scanf("%d",&x),a[i]|=(1<<(x-1));
    }
    f[0]=1;
    for(int i=1;i<(1<<m);++i){
       int r=count(i);
       if(r>n)continue;
       int t=i&a[r];
       while(t>0)f[i]+=f[i^(t&(-t))],t-=(t&(-t));
       if(r==n)ans+=f[i];
    }
    printf("%d\n",ans);
    return 0;
}