POJ2411 Mondriaan's Dream 【状压dp】

原创 2017年03月26日 08:46:29

题目链接:http://poj.org/problem?id=2411

题意:
有一个n*m的矩形,有若干个2*1的小长方形,问用小长方形把这个矩形铺满的方案书,多组输入,以 0 0为结束

题解:
在某行中,用一个二进制串来表示铺的情况,0表示当前格子没铺,1表示当前格子铺了,然后YY一下转移,输出dp[n][(2^m)-1],这里的^表示的是幂。
也可以写成:blog上写不出<<啊 QWQ
注意一下位运算的优先级!被坑了!

代码:

#include <cstdio>
#include <cstring>

const int size = (1 << 15) +5;
typedef long long LL;
LL a[15][size];
int n, m;

void init(int d, int s) {
    if(d == m+1) {
        a[1][s] ++;
        return ;
    }

    if( d <= m ) init(d+1, s << 1);
    if( d < m ) init(d+2, s << 2 | 3);
}   

void dfs(int d, int s1, int s2, int t) {
    if(d == m+1) {
        a[t][s1] += a[t-1][s2];
        return ;
    }
    if(d <= m) {
        dfs(d+1, s1 << 1 | 1, s2 << 1, t);
        dfs(d+1, s1 << 1, s2 << 1 | 1, t);
    }
    if(d < m) dfs(d+2, s1 << 2|3, s2 << 2 | 3, t);
}

int swap(int &x, int &y) {
    int t = x; x = y; y = t;
}

int main() {
    while( scanf("%d %d", &n, &m), n+m ) {
        if((n*m)%2) {
            puts("0");
            continue;
        }
        memset(a, 0, sizeof(a));
        if(n > m) swap(n, m);
        init(1, 0);
        for ( int i = 2; i <= n; i ++ ) dfs(1, 0, 0, i);
        printf("%lld\n", a[n][(1<<m)-1]);
    }

    return 0;
}
版权声明:博主小白,如有不当请指出!

相关文章推荐

poj2411 Mondriaan's Dream--状压dp

原题链接:http://poj.org/problem?id=2411 . 题意:一个n*m的方格,给定一个1*2的方块,要求用这个方块填充方格,填满,一共多少种填充方法。 分析:对于一...
  • LaoJiu_
  • LaoJiu_
  • 2016年10月26日 13:22
  • 248

poj 2411 Mondriaan's Dream 经典状压DP+记忆化搜索

转送门:poj 2411 Mondriaan’s Dream题目大意给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法。解题思路因为对应于一个方格来讲,有两种状...

Mondriaan's Dream POJ - 2411 状压DP

用2进制的01表示不放还是放 第i行只和i-1行有关 枚举i-1行的每个状态,推出由此状态能达到的i行状态 如果i-1行的出发状态某处未放,必然要在i行放一个竖的方块,所以我对上一行状态按位取反之后的...

poj2411 Mondriaan's Dream(状压dp)

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producin...

POJ 2411 Mondriaan's Dream [状压DP做法]

状压DP(多米诺骨牌问题)

POJ 2411-Mondriaan's Dream(状压DP->骨牌铺满问题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226...

poj 2411 Mondriaan's Dream(状压DP->求铺方格的方法数)@

Mondriaan's Dream Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Subm...

POJ 2411 Mondriaan's Dream 状压dp

题目大意:给定n*m的方格图,求用1*2的砖块铺满的方案总数。 题目分析:对于i行j列的格子,有三种情况:1.不填,被i-1行j列的填了。2.填,和i行j-1列构成一个砖块。3.填,同时填上i+1...

poj2411Mondriaan's Dream【覆盖类状压dp】

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

POJ 2411 Mondriaan's Dream (状压dp)

题目原文: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after p...
  • wchhlbt
  • wchhlbt
  • 2017年02月21日 20:21
  • 120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ2411 Mondriaan's Dream 【状压dp】
举报原因:
原因补充:

(最多只允许输入30个字)