POJ 2441 Arrange the Bulls(狀態壓縮DP)

題目鏈接

題目大意是農場有M個場子,有N頭牛,每頭牛隻會去P個指定的場子,不同的牛不會在同一個場子,問把所有的牛分配好有幾種方法。

我一開始想到是記憶化搜索,但是發現記憶化什麼呢?
但我還是寫了一發,超了內存,優化一次,超了時間。。。

後來我發現2的20次方也就100,直接狀態壓縮dp把,但是內存呢,滾動,結果樣例都過不了,仔細一想,滾動數組好像要處理一下。

結果A了

#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#define LL long long
using namespace std;
int dp[2][(1<<20)];
int mp[21][22];
int n,m;

int main()
{

    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&mp[i][0]);
        for(int j=1;j<=mp[i][0];j++){
            scanf("%d",&mp[i][j]);
        }
    }
    memset(dp,0,sizeof(dp));
    dp[0][0] = 1;
    int nxt = 1,pre = 0;
    for(int i=0;i<n;i++){
        for(int j=1;j<=mp[i][0];j++){
            for(int k=1;k<(1<<m);k++){
                if(!(k&(1<<(mp[i][j]-1)))) continue;
                dp[nxt][k] += dp[pre][k&(~(1<<(mp[i][j]-1)))] ;
                //printf("%d %d %d\n",dp[nxt][k],i,j);
            }
        }
        memset(dp[pre],0,sizeof(dp[pre]));//就是這裏需要處理
        swap(nxt,pre);
    }
    int ans = 0;
    for(int i=1;i<(1<<m);i++) ans += dp[pre][i];
    printf("%d\n",ans);

}
發佈了40 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章