Mondriaan's Dream【状压DP】

测评传送门

题意:

给定一个 n*m 的矩形,用1*2的方块填充的所有方案数

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

思路:

像这样看上去就不会做的题目数据范围一般都不大(因为要用状压呀,大了能存的下吗?)

而且显然答案会很大,所以记得开 long long

正题----

我们可以一行一行地看,对于上一行地情况,可以是横着的也可以是竖着的,横着的对我们当前这一行的状态无影响,关键是竖着的方块我们在这一行必须给它接上。

我们用长度为 m 的二进制数来表示状态

  状态为竖着摆时的上半截,状态为 1 ,否则为 0

我们考虑当前这一行,如果上一行是1,我必须接上下半截,状态为 0 ;如果是 0 ,那我这一行就可以随便摆

设当前状态为 j,上一行状态为 k

所以必定满足:

  1. j&k==0
  2. j | k 状态中连续的 0 必须有偶数个

第二条也很显然,我们活下来的是什么状态呢?1表示竖着,0,表示横着且连续,如果 0 是奇数个,就不符合要求

所以我们就先需要预处理出合法的情况

code

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m;
long long f[12][1<<11];
bool ins[1<<11];

int main()
{
    while(scanf("%d%d",&n,&m) && n && m) {
        int mix=(1<<m);
        for(int i=0;i<mix;++i) {
            bool cnt=0,flag=0;
            for(int j=0;j<m;++j) {
                if(i>>j & 1) flag|=cnt,cnt=0;
                else cnt^=1;
            }
            ins[i]=flag|cnt?0:1;
        }
        f[0][0]=1;
        for(int i=1;i<=n;++i) {
            for(int j=0;j<mix;++j) {
                f[i][j]=0;
                for(int k=0;k<mix;++k) {
                    if((j&k)==0 && ins[j|k])
                        f[i][j]+=f[i-1][k];
                }
            }
        }
        printf("%lld\n",f[n][0]);
    }
    return 0;
}

Mondriaan's Dream【状压DP】

原文地址:https://www.cnblogs.com/qseer/p/9904356.html

时间: 2024-10-25 19:48:28

Mondriaan's Dream【状压DP】的相关文章

POJ 2411 Mondriaan&#39;s Dream(状压DP)

http://poj.org/problem?id=2411 求一个n*m矩阵用1*2方块去填满的情况有几种 思路:状压dp,先预处理那些状态之间能互相到达,情况就几种,上一个两个1,下一个状态也两个1,上一个为0,下一个必须为1,还有一种是上一个为1,下一个为0的情况 然后就一层层往后递推即可 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int

POJ 2411 &amp;&amp; HDU 1400 Mondriaan&#39;s Dream (状压dp 经典题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12341   Accepted: 7204 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

POJ 2411 Mondriaan&#39;s Dream ——状压DP 插头DP

[题目分析] 用1*2的牌铺满n*m的格子. 刚开始用到动规想写一个n*m*2^m,写了半天才知道会有重复的情况. So Sad. 然后想到数据范围这么小,爆搜好了.于是把每一种状态对应的转移都搜了出来. 加了点优(gou)化(pi),然后poj上1244ms垫底. 大概的方法就是考虑每一层横着放的情况,剩下的必须竖起来的情况到下一层取反即可. 然后看了 <插头DP-从入门到跳楼> 这篇博客,怒抄插头DP 然后16ms了,自己慢慢YY了一下,写出了风(gou)流(pi)倜(bu)傥(tong)

poj 2411 Mondriaan&#39;s Dream 状压dp入门

题意: 求h*w的矩形被1*2的小矩形覆盖的方案数. 分析: 状压dp入门,<挑战程序设计竞赛>上讲的很好,好几天才看懂. 代码: #include <iostream> using namespace std; __int64 ans[16][16]; int n,m; __int64 dp[2][1<<16]; __int64 solve() { int i,j,used; memset(dp,0,sizeof(dp)); __int64 *crt=dp[0],*n

POJ 2411 Mondriaan&#39;s Dream (状压DP)

题意:给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法. 析:对第(i,j)位置,要么不放,要么竖着放,要么横着放,如果竖着放,我们记第 (i,j)位置为0,(i+1,j)为1,如果横着放,那么我们记 (i,j),(i,j+1)都为1,然后dp[i][s]表示 第 i 行状态为 s 时,有多少方法,那么我们就可以考虑与和匹配的状态,这个也很容易判断. 代码如下: #pragma comment(linker, "/STACK:1024000000,102

POJ 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

poj2411--Mondriaan&#39;s Dream(状压dp+dfs)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12315   Accepted: 7189 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

POJ 2411 Mondriaan&#39;s Dream (状压+dfs)

Language: Default Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12405   Accepted: 7239 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

POJ 题目2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13519   Accepted: 7876 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series