题目大意

N头牛,M个谷仓,每个牛c都有它喜欢的若干个谷仓,现在要将这N头牛安排进谷仓,使得每个牛都位于它喜欢的谷仓,而每个谷仓只能有一头牛。求安排的方案总数。N, M <= 20

题目分析

将M个谷仓视为一个整数的M个位,位i为1表示谷仓i被牛占用,否则表示谷仓i没有被牛占用。用状态 dp[i][j] 表示前i头牛安排进谷仓,使得谷仓占用情况形成整数j,所有的方案总数,那么有递推公式: 
dp[i+1][j | 1 << k] = dp[i+1][j | 1 << k] + dp[i][j],其中j的第k位为0(放置两头牛都占用谷仓k),且k为第i+1头牛喜欢的某个谷仓。 
    由于dp[i+1][...]只和dp[i][...]有关,因此可以使用循环数组进行状态压缩。dp[i&1][...]表示前i头牛的情况,dp[(i-1)&1][...]表示前i-1头牛的情况。

实现(c++)

#include <iostream>
#include<stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 22
vector<int> gCowLikesBarn[MAX_N]; //存放牛i 喜欢的barns
//不超过20头牛,有牛位于barn k中,则第k位置为1,则用一个整数表示barn的使用情况。 不超过 1 << 22
//dp[i][j] 表示前i头牛,barn的占用情况构成数字j,则总的情形个数,则有递推公式
//dp[i+1][j | 1 << k] = dp[i+1][j | 1 << k] + dp[i][j],其中 j的二进制第k位上为0,否则存在重复,
//且k为第i+1头牛的一个喜欢的barn号 //dp[i+1][...] 只和 dp[i][...]有关,因此考虑使用滚动数组,优化空间。
int dp[2][1 << MAX_N]; int main(){
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++){
int p;
gCowLikesBarn[i].clear();
scanf("%d", &p);
for (int j = 1; j <= p; j++){
int barn;
scanf("%d", &barn);
gCowLikesBarn[i].push_back(barn - 1);
}
}
dp[0][0] = 1;
for (int i = 1; i <= n; i++){
memset(dp[i & 1], 0, sizeof(dp[i & 1])); //滚动数组的当前行(共两行)
for (int j = 0; j < (1 << m); j++){
if (dp[(i - 1) & 1][j] == 0) //如果前i-1头牛所在的barn构成j的方案总数为0,则j和第i头牛再构成的方案 不合法!
continue; for (int k = 0; k < gCowLikesBarn[i].size(); k++){ //dp[i+1][j | 1 << k] = dp[i+1][j | 1 << k] + dp[i][j]
if (((j >> gCowLikesBarn[i][k]) & 1) == 0){ //不能重复有牛
dp[i & 1][j | (1 << gCowLikesBarn[i][k])] += dp[(i - 1) & 1][j];
}
}
}
}
int count = 0;
//此时的dp[i][j]中存放了 n头牛所在的barn构成j的方案总数,全部加和
for (int i = 0; i < (1 << m); i++){
count += dp[n & 1][i];
}
printf("%d\n", count);
return 0;
}

poj_2441 状态压缩dp的更多相关文章

  1. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  2. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  3. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  4. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  5. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  6. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  7. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  8. Marriage Ceremonies(状态压缩dp)

     Marriage Ceremonies Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  9. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

随机推荐

  1. vim自动跳转到引用的函数

        安装:  yum install ctags 在你代码的根目录下执行:比如/data/www/test/trunkctags -R * 打开文件只能在根目录下打开就可以,比如 vim appl ...

  2. 【C#/WPF】UI控件的拖拽/拉伸

    需求①:控件拖拽——按住鼠标,可自由拖拽控件. 方法:目前看到的办法有两种. 使用ZoomableCanvas:http://www.cnblogs.com/gnielee/archive/2011/ ...

  3. 【转】【C#】实现依赖注入

    1. 问题的提出 开发中,尤其是大型项目的开发中,为了降低模块间.类间的耦合关系,比较提倡基于接口开发,但在实现中也必须面临最终是“谁”提供实体类的问题.Martin Fowler在<Inver ...

  4. Android——适配器其他组件(AutoCompleteTextView:自动完成文本编辑框;Spinner:下拉列表)

    activity_activitywenben.xml <?xml version="1.0" encoding="utf-8"?> <Lin ...

  5. [转]Python Web部署方式总结

    学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...

  6. Java中上传文件和表单数据提交如何保持数据的一致性?

    学生申请学科竞赛活动,表单中有学科竞赛的申报信息和部分附件,需要做到将上传文件和表单数据提交保持一致性. 将上传文件和插入表单数据放到事务汇总去处理,由于表单的数据我们可以控制,但是上传的文档不好控制 ...

  7. file文件与base64字符串的相互转换

    今天心情不好,不想说话. /** * 文件转base64字符串 * @param file * @return */ public static String fileToBase64(File fi ...

  8. 《FPGA全程进阶---实战演练》第二章之硬件平台的搭建

    学习FPGA,多多少少应该要懂得硬件电路的设计,这样不单单增加了自己的技能,而且还能够对FPGA的硬件实现有更好的了解. 1 模块划分 对于一个基本的FPGA硬件平台,常用的几个电路部分:(1)电源电 ...

  9. 关于Cocos2d-x中UI按钮的定义

    1.要有两张不同状态的图片 2.定义一个MenuItemSprite的实例,把这两张图的Sprite实例放进MenuItemSprite的实例 3.把MenuItemSprite的实例放进Menu实例 ...

  10. e675. 翻转缓冲图像

    // To create a buffered image, see e666 创建缓冲图像 // Flip the image vertically AffineTransform tx = Aff ...