状压DP

Mondriaan's Dream
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 9938 Accepted: 5750

Description

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangles), he dreamt of filling a large rectangle with small rectangles of width 2 and height 1 in varying ways. 

Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!

Input

The input contains several test cases. Each test case is made up of two integer numbers: the height h and the width w of the large rectangle. Input is terminated by h=w=0. Otherwise, 1<=h,w<=11.

Output

For each test case, output the number of different ways the given rectangle can be filled with small rectangles of size 2 times 1. Assume the given large rectangle is oriented, i.e. count symmetrical tilings multiple times.

Sample Input

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

Sample Output

1
0
1
2
3
5
144
51205

Source

Ulm Local 2000

用0表示竖着放的木块的上半部分,单独的1表示竖着的木块的下半部分,两个连续的1表示横着放的木块.
最后一行铺满的状态就是全部为1

上下行的兼容性:
 1:下面为0上面一定不能为0
 2:下面为1.....如果上面为0,那么这是一个单独的1
                    如果上面为1,那么这应该是一个连续的1,检查下一位是否为1,及下一位的上面是否为1

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

long long int dp[14][1<<14];
int r,c;

bool isfirst(int x)
{
    int ans=0;
    for(int i=0;i<c;i++)
        if((x>>i)&1) ans++;
    if(ans%2==1) return false;
    for(int i=0;i<c;i++)
    {
        if((x>>i)&1)
        {
            if((x>>(i+1))&1)
                i++;
            else
                return false;
        }
    }
    return true;
}

void getfirstline()
{
    for(int i=0;i<(1<<c);i++)
    {
        if(isfirst(i))
        {
            dp[1]=1;
/*
            for(int j=0;j<c;j++)
            {
                printf("%d ",(i>>j)&1);
            }
            putchar(10);
*/
        }
    }
}

bool isCool(int xia,int shang)
{
    for(int i=0;i<c;i++)
    {
        if(((xia>>i)&1)==0)
        {
            if(((shang>>i)&1)==0) return false;
        }
        else
        {
            if(((shang>>i)&1)==0) continue;
            else
            {
                if(i+1>=c) return false;
                if(((xia>>(i+1))&1)==1)
                {
                    if(((shang>>(i+1))&1)==1)
                        i++;
                    else
                        return false;
                }
                else
                    return false;
            }
        }
    }
    return true;
}
int main()
{
    while(scanf("%d%d",&r,&c)!=EOF&&r&&c)
    {
        memset(dp,0,sizeof(dp));
        if(r<c) swap(r,c);
        getfirstline();
        for(int i=2;i<=r;i++)
        {
            for(int j=0;j<(1<<c);j++)
            {
                for(int k=0;k<(1<<c);k++)
                {
                    if(isCool(j,k))
                    {
                        dp[j]+=dp[i-1][k];
                    }
                }
            }
        }
        printf("%I64d\n",dp[(1<<c)-1]);
    }
    return 0;
}

* This source code was highlighted by YcdoiT. ( style: Codeblocks )

POJ 2411 Mondriaan&#39;s Dream的更多相关文章

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

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

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

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

  3. 状压DP POJ 2411 Mondriaan'sDream

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

  4. POJ 2411 Mondriaan's Dream 插头dp

    题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...

  5. Poj 2411 Mondriaan's Dream(压缩矩阵DP)

    一.Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, ...

  6. POJ 2411 Mondriaan's Dream -- 状压DP

    题目:Mondriaan's Dream 链接:http://poj.org/problem?id=2411 题意:用 1*2 的瓷砖去填 n*m 的地板,问有多少种填法. 思路: 很久很久以前便做过 ...

  7. poj 2411 Mondriaan's Dream(状态压缩dP)

    题目:http://poj.org/problem?id=2411 Input The input contains several test cases. Each test case is mad ...

  8. poj 2411 Mondriaan's Dream(状态压缩dp)

    Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...

  9. poj 2411 Mondriaan's Dream 轮廓线dp

    题目链接: http://poj.org/problem?id=2411 题目意思: 给一个n*m的矩形区域,将1*2和2*1的小矩形填满方格,问一共有多少种填法. 解题思路: 用轮廓线可以过. 对每 ...

随机推荐

  1. CSS基础知识真难啊-background-渐变

    文章参考 http://www.zhangxinxu.com/wordpress/?p=727 http://www.uqu8.com/html/2014/html-css_1105/176.html ...

  2. 手机卫士开发记录之handler错误

  3. java编译错误 程序包javax.servlet不存在javax.servlet.*

    java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...

  4. POJ - 2253 Frogger(Dijkstra变形题)

    题意: 题目撰写者的英语真是艰难晦涩,看了别人题解,才知道这题题意. 两个forger 一个froger 要蹦到另外一个froger处,他们的最短距离是这样定义的 : The frog distanc ...

  5. BZOJ3224 普通平衡树

    传送门: Treap 版本: //OJ 1999 //by Cydiater //2016.8.30 #include <iostream> #include <cstdio> ...

  6. 数论 Note.

    1. $ax+by=1 \rightarrow gcd(a,b)=1$ 2.如果一个数的后n位能被$2^n$整除,那么这个数能被$2^n$整除. 3.如果一个数的各位数之和能被3,9整除,那么这个数能 ...

  7. 最小路径(prim)算法

    #include <stdio.h>#include <stdlib.h>/* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...

  8. PHP实现观察者模式

    <?php //php设计模式观察者模式 /** 被观察者 */ class user implements SplSubject{ public $lognum; public $hobby; ...

  9. C#操作XML,如何获取指定节点值?

    博客园提问,结合网友回答http://q.cnblogs.com/q/36082/   打开是treelist树形显示xml所有节点,递归来实现 xmlDoc = new XmlDocument(); ...

  10. Redis总结(二)C#中如何使用redis

    上一篇讲述了安装redis<Redis总结(一)Redis安装>,同时也大致介绍了redis的优势和应用场景.本篇着重讲解.NET中如何使用redis和C#. Redis官网提供了很多开源 ...