#include<stdio.h>
int dp[1<<20],cow[25][25];
int ok(int x)
{
int ans=0;
while(x>0)
{
ans+=x&1;
x>>=1;
}
return ans;
}
int main(void)
{
int res=0,n,m,i,q,c,j,k,cnt;
while(~scanf("%d%d",&n,&m))
{
res=0;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
cnt=1;
scanf("%d",&cow[i][0]);
q=cow[i][0];
while(q--)
{
scanf("%d",&c);
cow[i][cnt]=c;
cnt++;
}
}
dp[0]=1;
for(i=1;i<=n;i++)
{
for(j=0;j<1<<m;j++)
{
if(ok(j)==i-1&&dp[j])
{
for(k=1;k<=cow[i][0];k++)
{
if(!((j>>(cow[i][k]-1))&1))
{
dp[j|1<<(cow[i][k]-1)]+=dp[j];
}
}
}
}
}
for(i=0;i<1<<m;i++)
{
if(ok(i)==n)
res+=dp[i];
}
printf("%d\n",res);
}
}
poj 2441 状态压缩
最新推荐文章于 2023-11-12 19:17:08 发布