题目:在m*n的地板上铺上同样的1*2的地板砖,问有多少种铺法。

分析:dp,组合,计数。经典dp问题,状态压缩。

状态:设f(i,j)为前i-1行铺满,第i行铺的状态的位表示为j时的铺砖种类数;

转移:由于仅仅能横铺或者竖铺。那么一个砖块铺之前的状态仅仅有两种;

且假设当前竖放会对下一行产生影响,建立相邻两行状态相应关系。

这里利用dfs找到全部f(i。j)的上一行的全部前置状态f(i-1,k)加和就可以。

f(i。j)= sum(f(i-1,k)){ 当中,f(i-1,k)能够产生f(i。j)状态 };

(大黄的三维DP实现简单,效率较差。)

组合学公式 :π(4cos(pi+i/(h+1))^2+4cos(pi+j/(w+1))^2) { 1<=i<=h/2,1<=j<=w/2 }。

说明:纠结N久最后发现%I64d一直WA。%lld就过了。(2011-09-27 19:15)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct node
{
int s,l;
}seg;
seg S[ 10 ]; long long F[ 12 ][ 1<<11 ]; int V[ 1<<11 ][ 99 ];
int Count[ 1<<11 ]; //用dfs找到能够到达的状态
void dfs( int A, int B, int C )
{
if ( !A ) {
V[ C ][ ++ Count[ C ] ] = B;
return;
}else {
int V = A&-A;//取得最后一个 1的位置
dfs( A&~V, B&~V, C );
if ( A&(V<<1) ) dfs( A&~(3*V), B, C );
}
} int main()
{
int n,m;
while ( scanf("%d%d",&n,&m) != EOF && m ) { if ( n%2&&m%2 ) {printf("0\n");continue;}
if ( m>n ) {int t = m;m = n;n = t;} int M = (1<<m)-1;
for ( int i = 0 ; i <= M ; ++ i ) {
Count[ i ] = 0;
dfs( i, M, i );
} for ( int i = 0 ; i <= n ; ++ i )
for ( int j = 0 ; j <= M ; ++ j )
F[ i ][ j ] = 0LL;
F[ 0 ][ M ] = 1LL; for ( int i = 1 ; i <= n ; ++ i )
for ( int j = M ; j >= 0 ; -- j )
for ( int k = Count[ j ] ; k >= 1 ; -- k )
F[ i ][ j ] += F[ i-1 ][ V[ j ][ k ] ]; printf("%lld\n",F[ n ][ M ]);
}
return 0;
}

zoj 1100 - Mondriaan&#39;s Dream的更多相关文章

  1. POJ 2411 Mondriaan&#39;s Dream

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

  2. poj 2411 Mondriaan&#39;s Dream 【dp】

    题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...

  3. [ACM] HDU 1400 Mondriaan&#39;s Dream (状态压缩,长2宽1长方形铺满)

    Mondriaan's Dream Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

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

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

  5. 状压dp Mondriaan&#39;s Dream poj2411

    超经典的一道题目,实现这题的方法也有非常多种 1.利用DFS建立矩阵,然后通过高速矩阵幂得到答案(运用于min(m,n)比較小.可是max(m,n)很大的情况) 2.利用dp状压解决 第一种在我的还有 ...

  6. HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)

    Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...

  7. UVA - 10057 A mid-summer night&#39;s dream.

    偶数时,中位数之间的数都是能够的(包含中位数) 奇数时,一定是中位数 推导请找初中老师 #include<iostream> #include<cstdio> #include ...

  8. HDU 4430 &amp; ZOJ 3665 Yukari&#39;s Birthday(二分法+枚举)

    主题链接: HDU:pid=4430" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=4430 ...

  9. zoj 1738 - Lagrange&#39;s Four-Square Theorem

    称号:四方形定理.输出可以表示为一个数目不超过四个平方和表示的数. 分析:dp,完全背包.背包分割整数.可用一维分数计算,它也可以被写为一个二维团结. 状态:设f(i,j,k)为前i个数字,取j个数字 ...

随机推荐

  1. java使用maven项目(二)分模块开发

    1       整合ssh框架 1.1     依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 1.2     依赖版本冲突的解决 1.  第 ...

  2. 使用 gulp 编译 Sass

    无论是 node-sass 还是 ruby-sass 使用 npm 安装都非常的慢,甚至会装不上.及其不利于团队协作.建议使用 less 作为 css 预处理器. 如果因为 less 不支持自定义函数 ...

  3. 从1到整数n中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共出现了5次.   不考虑时间效率的解法: int Numbe ...

  4. django实现动态菜单的方式

    1.model from django.contrib.auth.models import User #django自带 class UserProfile(models.Model): " ...

  5. [linux]多线程下载

    axel -n 10 -o /tmp/ http://soft.vpser.net/lnmp/lnmp0.7-full.tar.gz # 10是线程数

  6. linux进程通信之管道

    1.介绍: 1)同一主机: unix进程通信方式:无名管道,有名管道,信号 system v方式:信号量,消息队列,共享内存 2)网络通信:Socket,RPC 2.管道: 无名管道(PIPE):使用 ...

  7. NOIP2018提高组模拟题(四)

    能量(energy) Description ​ 有一块能量田,它的形状是 n*m的矩形,每一个格子上都有一个能量值 a[x][y] (可正可负).一块矩形田的能量定义为它的每个格子的能量值之和. ​ ...

  8. Proxmox VE

    Proxmox虚拟化环境是基于QEMU/KVM和LXC的开源服务器虚拟化管理解决方案.我们可以使用集成的易于使用的WEB界面或通过CLI管理虚拟机,容器,高可用集群,存储和网络. Proxmox VE ...

  9. [BZOJ 1801] Chess

    Link: BZOJ 1801 传送门 Solution: 一眼看过去又像是状压$dp$的经典模型…… 但此题$n,m\le 100$ ,直接跑状压只有50分 此时要发现这道题的特点:每行/列不能放置 ...

  10. 【费用流】bzoj2661 [BeiJing wc2012]连连看

    将每个数拆点,互相连边,然后满足条件的数对之间互相连边,跑最大费用流,答案是流量和费用分别除以2. 一定要i->j.j->i都连上,否则可能会出现一个数在一边被选择了,在另一边的另一个匹配 ...