题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案。

思路:

状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765

用1表示放置了骨牌,0表示没有放置。dp[i][j]表示第i行为状态j是有多少种方案。

分下面3种情况进行转移: d表示当前列号,s1 表示本行的状态,s2表示上一行的状态,

1 竖直放置   那么d=d+1,s1<<1|1 , s2<<1;

这是什么意思呢? 这表示上一行在d列没有放置骨牌,那么这一行必须放置。下面同理。

2 水平放置 那么 d=d+2,s1<<2|3,s2<<2|3;

3 不放置   那么 d=d+1,s1<<1,s2<<1|1;

初始化 d=1,s1=s2=0; 第一行放置时,可以虚拟第0行,看做已经放好了。那么他的情况就只有两种,见init()。

注意用大整型。

#include<iostream>
#include<algorithm>
const int N = 12;
const int maxn = 1<<N;
using namespace std;
int n,m;
__int64 dp[N][maxn];
void init(int d,int s)//初始化第一行
{
if(d == m+1)
{
dp[1][s]++;
return;
}
if(d + 1 <= m+1)
init(d+1,s<<1);//竖放
if(d + 2 <= m+1)
init(d+2,s<<2|3);//平放
}
void dfs(int d,int s1,int s2,int row)//d对应当前列号,s1对应本行,s2对应上的状态,row为当前行号
{
if(d == m+1)
{ dp[row][s1]+=dp[row-1][s2]; return ; }
if(d + 1 <= m+1)
{
dfs(d+1,s1<<1|1,s2<<1,row);//竖放
dfs(d+1,s1<<1,s2<<1|1,row);//不放
}
if(d + 2 <= m+1)
dfs(d+2,s1<<2|3,s2<<2|3,row);//平放
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF && (m || n))
{
if((m*n)%2) { puts("0"); continue; }//都为奇数时候放不下。
memset(dp,0,sizeof(dp));
init(1,0);
for(int i=2;i<=n;i++)
dfs(1,0,0,i);
printf("%I64d\n",dp[n][(1<<m)-1]);
}
return 0;
}

poj 2411 Mondriaan's Dream_状态压缩dp的更多相关文章

  1. poj 2411 Mondriaan's Dream(状态压缩dP)

    题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...

  2. poj 2411 Mondriaan&#39;s Dream 【dp】

    题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...

  3. POJ 1691 Painting a Board(状态压缩DP)

    Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat boa ...

  4. poj 3311 floyd+dfs或状态压缩dp 两种方法

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6436   Accepted: 3470 ...

  5. POJ 2686_Traveling by Stagecoach【状态压缩DP】

    题意: 一共有m个城市,城市之间有双向路连接,一个人有n张马车票,一张马车票只能走一条路,走一条路的时间为这条路的长度除以使用的马车票上规定的马车数,问这个人从a出发到b最少使用时间. 分析: 状态压 ...

  6. POJ_2411_Mondriaan's Dream_状态压缩dp

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 15407   Accepted: 888 ...

  7. 【poj2411】Mondriaan's Dream 状态压缩dp

    AC传送门:http://vjudge.net/problem/POJ-2411 [题目大意] 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? [题解] 对于 ...

  8. poj 1185 炮兵阵地 [经典状态压缩DP]

    题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...

  9. POJ 1038 Bug Integrated Inc(状态压缩DP)

    Description Bugs Integrated, Inc. is a major manufacturer of advanced memory chips. They are launchi ...

随机推荐

  1. Java 微服务框架 Redkale 入门介绍

    Redkale 功能 Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全.既可作为服务器使用,也可当工具包使用.作为独立的工具包提供以下功能:1.convert包提供JSON的序列化和反序列化功 ...

  2. Web 前端利器Emmet 的HTML用法总结

    在tutsplus那里看到一篇文章介绍Emmet 的用法,形象的gif图片一目了然,本来想翻译过来的(虽然翻译用法倒不是很难),但搜索发现已经有国人翻译过了,遂直接拿来转载在这里. Emmet 简介 ...

  3. JavaScript 判断一个字符串是否在另一个字符串中

    传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否找到了参数字符串. start ...

  4. 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类

    经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...

  5. LoadRunner测试下载功能点脚本(方法二)

    在上一篇<LoadRunner下载功能点脚本(方法一)>中,实现的脚本仅是录制下载功能点的脚本,现在性能需求的场景更改如下: 性能需求:对系统某页面中,点击下载并将下载文件保存到本地电脑的 ...

  6. 8个常用的Android开发工具

    周末发现一些比较有用的android开发常用的工具,里面大部分是自己经常用的,还有一些暂时很少用,暂且在这里记录下,以后一定同样会经常用到的. 1 The SDK and AVD Manager 这个 ...

  7. MySQL复制协议

    http://hamilton.duapp.com/detail?articleId=27

  8. C#扩展方法的理解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些 ...

  9. 《第一行代码》学习笔记13-UI(2)

    1.EditText:程序和用户进行交互的重要控件,允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理. 2.Android控件使用的一般规律:给控件定义一个id->指定下控件的宽 ...

  10. C# string的一些函数

    创建string: string (char[])      使用指定的字符串数组构建一个新的string对象 Copy(string) 使用指定的string构建一个新的string对象 比较函数: ...