您的位置:首页 > 其它

POJ2441 Arrange the Bulls(状压DP)

2016-02-14 09:20 519 查看
题目是,有n头牛,每头牛都喜爱某几个草地,要把这n头牛分配给m个不同的它们喜爱的草地,问有几种分配方式。

dp
[S]表示前n头牛分配完毕后占用的草地集合是S的方案数

dp[0][0]=1

dp
[S]+=dp[n-1][S-x](x∈S且n喜爱x)

不过的状态这样空间开销太大了,事实上n这个维度的信息S就包含了,所以dp[S]即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[1<<20];
bool map[22][22];
int main(){
int n,m,p,a;
scanf("%d%d",&n,&m);
for(int i=0; i<n; ++i){
scanf("%d",&p);
while(p--){
scanf("%d",&a);
map[i][a-1]=1;
}
}
int res=0;
d[0]=1;
for(int i=1; i<(1<<m); ++i){
int cnt=-1;
for(int j=0; j<m; ++j){
if((i>>j)&1) ++cnt;
}
for(int j=0; j<m; ++j){
if(((i>>j)&1) && map[cnt][j]) d[i]+=d[i^(1<<j)];
}
if(cnt==n-1) res+=d[i];
}
printf("%d",res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: