poj 2411 Mondriaan's Dream_状态压缩dp
题意:给我们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的更多相关文章
- poj 2411 Mondriaan's Dream(状态压缩dP)
题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...
- poj 2411 Mondriaan's Dream 【dp】
题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...
- POJ 1691 Painting a Board(状态压缩DP)
Description The CE digital company has built an Automatic Painting Machine (APM) to paint a flat boa ...
- poj 3311 floyd+dfs或状态压缩dp 两种方法
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6436 Accepted: 3470 ...
- POJ 2686_Traveling by Stagecoach【状态压缩DP】
题意: 一共有m个城市,城市之间有双向路连接,一个人有n张马车票,一张马车票只能走一条路,走一条路的时间为这条路的长度除以使用的马车票上规定的马车数,问这个人从a出发到b最少使用时间. 分析: 状态压 ...
- POJ_2411_Mondriaan's Dream_状态压缩dp
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15407 Accepted: 888 ...
- 【poj2411】Mondriaan's Dream 状态压缩dp
AC传送门:http://vjudge.net/problem/POJ-2411 [题目大意] 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? [题解] 对于 ...
- poj 1185 炮兵阵地 [经典状态压缩DP]
题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...
- POJ 1038 Bug Integrated Inc(状态压缩DP)
Description Bugs Integrated, Inc. is a major manufacturer of advanced memory chips. They are launchi ...
随机推荐
- jQuery 各种选择器 $.()用法
jQuery 元素选择器jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") 选 ...
- hdu 4055 Number String(dp)
Problem Description The signature of a permutation is a string that is computed as follows: for each ...
- Android UI开发详解之ActionBar .
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...
- WAS集群系列(6):集群搭建:步骤4:安装WAS升级软件
逐步点击"下一步",注意一处流程,例如以下列举: "升级软件"安装的路径设置,建议与之前的WAS及IHS安装的绝对路径同样,例如以下所看到的: 逐步点击,完毕安 ...
- CentOS CVS安装使用
CentOS CVS安装使用 一.CVS简介 CVS(Concurrent Versions System)版本控制系统:是一种GNU软件包,CVS是一个C/S系统,主要用于在多人开发环境下的源码 ...
- 解析Function.prototype.bind
简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的 ...
- Winform改变Textbox边框颜色(转)
namespace MyTextBoxOne { //使用时必须把文本框的BorderStyle为FixedSingle才能使用 //一些控件(如TextBox.Button等)是由系统进程绘制,重载 ...
- Ado.net对象
Connection对象主要提供与数据库的连接功能 Command 对象用于返回数据,修改数据,运行存储过程以及发送或检索参数信息的数据库命令. DataReader对象通过Command对象提供从数 ...
- UVA10305 拓扑排序
网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117863#problem/B 思路分析:裸的拓扑排序,注释在代码中. 代码: #i ...
- C++11 lambda表达式学习
lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档h ...