POJ 2241 Mondriaan's Dream
题意:给一块n×m的空地,用1×2的砖铺,有多少种方案。
解法:状压dp。考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数。对于第i行,每个格子上是否有砖用0和1表示,0表示不铺砖,1表示铺砖,二进制压缩状态,枚举第i - 1行的状态j和第i行的状态k,看这两种状态是否符合实际,如果符合实际,dp[i][k] += dp[i - 1][j]。因为在看第i行时要求i - 1行都铺满,所以j状态中0的位置k都必须是1,表示放一块2×1的砖,剩下的部分如果k的位置是1,则是放了1×2的砖,所以每段1的长度必须是偶数。
我貌似判是否符合实际的地方写屎了……总之没T就好哈哈哈哈哈哈哈
还有两个剪枝是n×m如果是奇数则答案是0,因为一块砖的面积是2,另一个剪枝是选择n和m中小的作为列数,可以让状态小一些,另外将答案打表也可以减少时间,我本来想把状态之间是否符合实际也打表……后来意识到这样是错的。
还有就是int会爆……orz
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<iomanip>
#define LL long long
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1 using namespace std; int n, m;
LL ans[15][15];
LL dp[15][2050];
bool judge(int x, int y)
{
int vis[20] = {0};
for(int i = 0; i < m; i++)
{
if((x & (1 << i)) == 0)
{
vis[i] = 1;
if((y & (1 << i)) == 0) return false;
}
}
for(int i = 0; i < m - 1; i++)
{
if(vis[i] && (y & (1 << i))) continue;
if(vis[i] && !(y & (1 << i))) return false;
if(!vis[i] && (y & (1 << i)))
{
if(vis[i + 1]) return false;
vis[i] = 1;
vis[i + 1] = 1;
}
}
if(vis[m - 1] && !(y & (1 << (m - 1)))) return false;
if(!vis[m - 1] && (y & (1 << (m - 1)))) return false;
return true;
}
LL solve()
{
memset(dp, 0, sizeof dp);
dp[0][(1 << m) - 1] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < (1 << m); j++)
{
for(int k = 0; k < (1 << m); k++)
{
if(judge(j, k)) dp[i][k] += dp[i - 1][j];
}
}
}
return dp[n][(1 << m) - 1];
}
int main()
{
while(~scanf("%d%d", &n, &m) && !(n == 0 && m == 0))
{
if((n * m) & 1)
{
puts("0");
continue;
}
if(m > n) swap(n, m);
if(ans[n][m])
{
cout << ans[n][m] << endl;
continue;
}
ans[n][m] = solve();
cout << ans[n][m] << endl;
}
return 0;
}
POJ 2241 Mondriaan's Dream的更多相关文章
- [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
题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...
- POJ 2411 Mondriaan's Dream 插头dp
题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...
- POJ - 2411 Mondriaan's Dream(轮廓线dp)
Mondriaan's Dream Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nig ...
- [POJ] 2411 Mondriaan's Dream
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- [poj 2411]Mondriaan's Dream (状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 18903 Accepted: 10779 D ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- Poj 2411 Mondriaan's Dream(压缩矩阵DP)
一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...
- poj 2411 Mondriaan's Dream(状态压缩dp)
Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...
随机推荐
- tensorflow + pycharm安装即相关资料
1. tensorflow安装教程:https://www.tensorflow.org/versions/r0.8/get_started/os_setup.html#pip-installatio ...
- Android核心分析之十五Android输入系统之输入路径详解
Android用户事件输入路径 1 输入路径的一般原理 按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题.按键,鼠标等用户消息 ...
- VS2013编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- 转载网易博客:整理各大网站让网站变灰的css代码
2013-07-21 15:06:47 北京时间2013年4月20日8时02分四川省雅安市芦山县(北纬30.3,东经103.0)发生7.0级地震.震源深度13公里.各大网站将其网站变灰,本人整理了下部 ...
- http://blog.csdn.net/hguisu/article/details/7533759
http://blog.csdn.net/hguisu/article/details/7533759
- 278. First Bad Version
题目: You are a product manager and currently leading a team to develop a new product. Unfortunately, ...
- 如何创建PostgreSQL数据库
PostgreSQL提供两种方式创建一个新的数据库:第一种是使用CREATE DATABASE的SQL命令.第二种使用createdb的一个命令行可执行文件. 第一种:使用CREATE DATABAS ...
- 一些数论概念与算法——从SGU261谈起
话说好久没来博客上面写过东西了,之前集训过于辛苦了,但有很大的收获,我觉得有必要把它们拿出来总结分享.之前一直是个数论渣(小学初中没好好念过竞赛的缘故吧),经过一道题目对一些基础算法有了比较深刻的理解 ...
- Linux多线程(三)(同步互斥)
1. 线程的同步与互斥 1.1. 线程的互斥 在Posix Thread中定义了一套专门用于线程互斥的mutex函数.mutex是一种简单的加锁的方法来控制对共享资源的存取,这个互斥锁只有两种状态(上 ...
- Spring3.1新特性介绍
Spring3.1新特性 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类. 二.Spring2.5引入注解式处理器支持,通过@Controller ...