Mondriaan's Dream
poj2411:http://poj.org/problem?id=2411
题意:给你1*2的方块,让你把n*m的房间填好有多少种方式。
题解:状压dp。这一题,我是不会做了,看懂了题解之后,震惊了。这Dp只要找对状态方程,简直就是一种艺术啊。我深深的喜欢上DP了。好了。讲讲这一题吧。首先是状态方程f[i][j]表示第i行第j个状态所得的方案数。j有3种形式,如果出现1,那么1表示这一行会放一个竖的,0表示不放,00表示横着放一块。并且用f[i][0]表示第i行什么都不放。好了,然后是枚举状态了。对于本行的 状态s1和上一行状态上s2来说,如果s1&s2>0的话,说明肯定存在一位,在这一位上上一行竖着放着一个,这一行应该是不放,但是这一位放了一个,显然这样的状态是不合理的。然后没有这样的状况的话,就要检查剩余的0是否两个两个连续,如果有多余0不是一对说明,这两行在这一位是空着的,这样也是不合理,因为这一位的两个空格,下一行是没有办补充上来的。这里最巧妙的就是用f[i][0]表示什么都不放,那么最终的答案就是f[n+1][0],而且初始化的话f[1][0]=1,这也是显然的。有了这些还有一些特判,如果n*m%2==1说明面积是奇数,但是面积不可能是奇数,所以不可能拼完。还有一个重要的地方就是(n<m),swap(n,m);这里还没有弄懂,但是不交换的话,答案就不对。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
long long f[][];
bool judge(int s1,int s2){
if(s1&s2)return ;
s1|=s2;
for(int i=;i<m;){
int j=(s1&(<<i));
if(j==){
if(i==m-)return ;
else if((s1&(<<(i+)))!=)return ;
i+=;
}
else i++;
}
return ;
}
int main(){
while(~scanf("%d%d",&n,&m)&&n){
memset(f,,sizeof(f));
if(n*m&){
printf("0\n");
continue;
}
f[][]=;
if(n<m)swap(n,m);
for(int i=;i<=n;i++){
for(int j=;j<(<<m);j++){
for(int k=;k<(<<m);k++){
if(judge(j,k)){
f[i+][j]+=f[i][k];
}
}
}
}
printf("%I64d\n",f[n+][]);
}
}
Mondriaan's Dream的更多相关文章
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)
Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...
- POJ2411 Mondriaan's Dream(状态压缩)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15295 Accepted: 882 ...
- POJ 2411 Mondriaan's Dream -- 状压DP
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ2411 铺地砖 Mondriaan's Dream
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15962 Accepted: 923 ...
- [poj P2411] Mondriaan's Dream
[poj P2411] Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18023 A ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- 【POJ2411】Mondriaan's Dream(轮廓线DP)
[POJ2411]Mondriaan's Dream(轮廓线DP) 题面 Vjudge 题解 这题我会大力状压!!! 时间复杂度大概是\(O(2^{2n}n^2)\),设\(f[i][S]\)表示当前 ...
- poj2411 Mondriaan's Dream【状压DP】
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20822 Accepted: 117 ...
- POJ - 2411 Mondriaan's Dream(轮廓线dp)
Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...
随机推荐
- Javascript --扩展String实现替换字符串中index处字符
String.prototype.replaceCharAt = function(n,c){ return this.substr(0, n)+ c + this.substr(n+1,this.l ...
- CMAKE 学习
http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html
- Java基础知识强化10:Java中的中间缓存变量机制
1.对于自增运算++j与j++,由于加一的执行顺序不同,所以Java中有中间缓存变量来储存其单个表达式的值,而j的自增自减的结果依然保留在原来的变量储存区.因为本体是j的值,而单个表达式的值是中间产生 ...
- 关于oracle的函数,存储过程,触发器,序列,视图,左右连接一些的应用 带案例
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID NAME VARCHAR2(20), CLASSNAME VA ...
- WebForm开发常用代码
1.获取服务器绝对路径: public static string GetMapPath(string strPath) { if (HttpContext.Current != null) { re ...
- 常用的 css 命名规则
头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper 左右中:left rig ...
- 监听polygon变化
Polygons are made of Paths which are just MVCArrays (in this case, they're a list of LatLng objects) ...
- Elasticsearch学习1--head插件安装
1.简要介绍 elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序. 2.最近尝试学习elasticsearch,查了一些资料,但 ...
- POJ2104 K-th Number 静态区间第k最值 平方分割
干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC ...
- 动态树LCT小结
最开始看动态树不知道找了多少资料,总感觉不能完全理解.但其实理解了就是那么一回事...动态树在某种意思上来说跟树链剖分很相似,都是为了解决序列问题,树链剖分由于树的形态是不变的,所以可以通过预处理节点 ...