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 ...
随机推荐
- Android数据库信息显示在listview上
Key Points: 1.使用SimpleCursorAdapter将Android数据库信息显示在listview上 adapter = new SimpleCursorAdapter(this, ...
- js如何判断字符串是否进行过window.btoa()转码
window.btoa()是基于Base64算法的.window.btoa()只能将ASCII字符进行转码 因此我们需要了解Base64的原理及主要特征:Base64的原理在这里就不多说了,网上很多讲 ...
- bootstrap学习以及其插件
Bootstrap中文网地址,里面有bootstrap组件的下载与使用说明,现在使用bootstrap3: http://www.bootcss.com/ W3CSchool.CC里面有学习boots ...
- Collections.sort()
Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- Ajax属性和函数以及 返回值之XML格式和文本格式(二)
(一) client请求文本之json格式:接收到json格式,再有js解析(详细先eval成对象,然后.就可以) var text = this.responseText; var book = e ...
- jQuery中 $ 符号的冲突问题
jQuery中 $ 符号的冲突问题是常见问题之一. 在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...
- andorid 开发笔记 -- 问题与解决
1. SQLiteDataBase 中 TimeStamp 转化为 Date 的问题:java.text.ParseException: Unparseable date: "Sun Jan ...
- LINUX进程上锁查看方法
jps -l 获取进程列表 jstack -l 8672 查看详细信息 查找启动任务的class 查看状态
- .NET程序猿 - 提升幸福感的组件一览
1.Newtonsoft.Json.net 操作JSON最简便的方式. .Net 3.5开始,Framework集成Json序列化器:JavaScriptSerializer,然而Json.net给 ...