POJ2441 2441 Arrange the Bulls

來源:互聯網
上載者:User

大意:有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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.