POJ 2441 Arrange the Bulls(状态压缩DP)

来源:互联网 发布:ss账号哪里购买好 知乎 编辑:程序博客网 时间:2024/05/01 22:34

题目链接

题目大意是农场有M个场子,有N头牛,每头牛只会去P个指定的场子,不同的牛不会在同一个场子,问把所有的牛分配好有几种方法。

我一开始想到是记忆化搜索,但是发现记忆化什么呢?
但我还是写了一发,超了内存,优化一次,超了时间。。。

后来我发现2的20次方也就100,直接状态压缩dp把,但是内存呢,滚动,结果样例都过不了,仔细一想,滚动数组好像要处理一下。

结果A了

#include <cstring>#include <cmath>#include <algorithm>#include <cstdio>#include <iostream>#include <map>#define LL long longusing 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);}
0 0
原创粉丝点击