题目:

id=2411" target="_blank">poj 2411 Mondriaan's Dream

题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案。

分析:这是一个比較经典的题目。网上各种牛B写法一大堆。题解也是

我们能够定义状态:dp【i】【st】:在第 i 行状态为 st 的时候的最慷慨案数、

然后转移方程:dp【i】【st】 = sum (dp【i-1】【ss】)

即全部的当前行都是由上一行合法的状态转移而来。

而状态的合法性由两种铺法得到。第一种横放。注意要求前一行全满。然后竖放,上一行为空。能够留空。

AC代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const long long N = 15;
long long dp[N][1<<N];
long long ans[N][N];
long long n,m;
bool solve(long long st)
{
long long tmp=0;
for(long long i=0; i<m; i++)
{
if(st&(1<<i))
tmp++;
else
{
if(tmp%2)
return false;
tmp=0;
}
}
if(tmp%2)
return false;
return true;
}
bool cmp(long long st,long long up)
{
for(long long i=0; i<m; i++)
{
if(st&(1<<i))
{
if(up&(1<<i))
{
if(i==m-1 || !(st&(1<<(i+1))) || !(up&(1<<(i+1))))
return false;
else
i++;
}//否则的话竖放
}
else
{
if(!(up&(1<<i)))
return false;
}
}
return true;
}
int main()
{
memset(ans,0,sizeof(ans));
while(~scanf("%lld%lld",&n,&m))
{
if(n==0 && m==0)
break;
if((m*n)%2)
{
printf("0\n");
continue;
}
if(m>n)
swap(m,n);
if(ans[n][m])
{
printf("%lld\n",ans[n][m]);
continue;
}
memset(dp,0,sizeof(dp));
long long len = 1<<m;
for(long long i=0; i<len; i++)
{
if(solve(i))
dp[1][i]=1;
}
for(long long i=2; i<=n; i++)
{
for(long long st=0; st<len; st++) //当前行
{
for(long long k = 0; k<len; k++) //上一行
{
if(cmp(st,k))
dp[i][st]+=dp[i-1][k];
}
}
}
printf("%lld\n",dp[n][len-1]);
ans[n][m] = dp[n][len-1];
}
return 0;
}

poj 2411 Mondriaan&#39;s Dream 【dp】的更多相关文章

  1. POJ 2411 Mondriaan&#39;s Dream (dp + 减少国家)

    链接:http://poj.org/problem?id=2411 题意:题目描写叙述:用1*2 的矩形通过组合拼成大矩形.求拼成指定的大矩形有几种拼法. 參考博客:http://blog.csdn. ...

  2. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  3. POJ 2411 Mondriaan'sDream(状压DP)

    题目大意:一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种. 解析:如果是横着的就定义11,如果竖着的定义为竖着的01,这样按行dp只需要考虑两件事儿,当前行&上一行,是不 ...

  4. poj 2411 Mondriaan's Dream_状态压缩dp

    题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案. 思路: 状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765 ...

  5. 状压DP POJ 2411 Mondriaan'sDream

    题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...

  6. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  7. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  8. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  9. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. UVA 10152-ShellSort(映射+栈)

    题意: 给出一堆乌龟名字,乌龟能从本身位置爬到顶端. 要求求出从原本的顺序到目标顺序的最小操作.输出每次操作移到顶端的乌龟的名字. 解析:名字用映射对应编号,把目标状态的乌龟从上到下的编号按1到N编好 ...

  2. tomcat配置访问日志,访问首页主目录

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" ...

  3. SVN在ubuntu的安装和使用

    安装: svn客户端:apt-get install subversion ,然后根据提示一步一步,就完成了svn的安装.当然,也可以源码安装 svn,下载 subversion 一个最新版本的源码包 ...

  4. 代码中实际运用memcached——mycode

    1.下载安装64位memcached.exe  下载地址:http://blog.couchbase.com/memcached-windows-64-bit-pre-release-availabl ...

  5. C++编程规范和标准总结

    文件名: 每个源代码文件应该有一个包含文件.每个包含文件描述了单个类或者多个类相结合的集合.一般头文件(.h,或.hpp)包含类的定义而不是实例.因此包含文件可以用在多个文件当中,源文件(.c,.或c ...

  6. 使用Jquery UI 高仿百度搜索下拉列表功能

    最近项目有个需求,在新添加商户的时候,用户输入商户名称后,如果系统中有类似的商户名称,直接显示出来,如下图的效果: 实现这个功能,直接使用了JQuery UI 插件 目前我使用的实现版本是: 网友可以 ...

  7. zepto的touch.js左右滑动存在一些问题,用百度的touch.js代替

    这几天用zepto想写一个移动端的活动,在实现左右滑动触发动画时,发现zepto的touch.js在ios的微信上有问题. 问题描述:左右滑动时如果手指没有一直跟频幕贴着(在手机上滑动时,如果手指不是 ...

  8. Jquery 工具类函数

    1.$.browser  获取当前浏览器的名称和版本信息 $.browser.chrome  获取chrome浏览器 $.browser.mozilla  获取火狐浏览器 $.browser.msie ...

  9. MSDTC问题集

    一.链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务. 尊重原著作:本文转载自http://sfwxw456.blog.163.com/blog/sta ...

  10. 关于OC中的几种代码延迟执行方式

    第一种: [UIView animateWithDuration:3 delay:3 options:1 animations:^{         self.btn.transform = CGAf ...