大意:有N頭牛,有M個房間,每個牛有特定的房間,每個房間只能養一隻牛。
分析:最近在學狀態DP,這道題目居然被我做出來了,估計難度也是為0,偷著樂吧。我發現ACM其實和以前的高中做題也差不多,而且對遷移能力的要求更高,我是若菜,不會遷。記得曾經做過求棋盤覆蓋的題,遷一下,把每頭牛當做一行,每個房間當做一列,覆蓋為1,否則為0.,附加一個like數組,記錄牛的特定房間,選了為1,否則為0。
#include<stdio.h>#include<string.h>int n,m,like[25],dp[1<<20],ans;//一開始多dp數組加了一維,MLE。。void dfs(int i,int rest,int lie,int s)//找出i個房間被住的所有狀況,只會DFS一種,求大牛指教。。{ if(rest==0) { int j; for(j=0;j<lie&&j<m;j++) if(s|(1<<j)&&like[i]&(1<<j)) dp[s]+=dp[s-(1<<j)]; if(i==n-1)ans+=dp[s]; return ; } if(rest>m-lie||lie>=m)return; dfs(i,rest,lie+1,s); dfs(i,rest-1,lie+1,s|(1<<lie));}int main(){ int i,p,j; while(scanf("%d%d",&n,&m)!=EOF) { memset(like,0,sizeof(like)); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { scanf("%d",&p); while(p--) { scanf("%d",&j); j--; like[i]|=(1<<j); } } for(i=0;i<m;i++) if(like[0]&(1<<i)) dp[1<<i]=1; ans=0; for(i=1;i<n;i++) dfs(i,i+1,0,0); printf("%d\n",ans); } return 0;}