poj2411 状态压缩-铺地板题型

一种做法是先打出所有的状态,即满足上下配对的所有可能方案,然后再逐行进行枚举计数

dp[i][s]=sum{dp[i-1][t]},t是所有和s配对的状态

打状态时要注意如果i-1的j是0,那么i的j必定是1,i剩下的位置要必须一对对填入1,也可以用0填入,即枚举i行的横放砖块的起始位置k即可,如果i-1的k或k+1有一个不是1,那么显然不能放下

/*
对于每一行,用11表示一个横放的方块,用0表示竖放方块的第一格,1表示竖放方块的第二格
枚举i-1行的状态,推出i行的状态
如果i-1行的j位置是0,那么第i行的j必须是1,第i行剩下的地方要么填连续两个1要么填0
第n行的状态必须都是1
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define ll long long
ll dp[15][1<<13];
int n,m,w,path[5000000][2];//所有可能的配对方案
void get(int m){
    for(int i=0;i<=(1<<m)-1;i++)
        for(int j=0;j<=(1<<m)-1;j++){
            int ok=1;
            for(int k=0;k<m;k++)
                if(ok){
                    if( !(i&(1<<k)) ){//i的第k位是0
                         if(!(j&(1<<k))){
                             ok=0;break;
                         }
                    }
                    else{//i的第k位是1,其实是在枚举j状态横放的起点位置
                        if(!(j&(1<<k)))continue;//j的第k位是0
                        ++k;
                        if(k>=m || !(i&(1<<k))){//i没有第k+1位或者i的第k+1位是0,所以j在k位置不可能横放了
                            ok=0;break;
                        }
                        else if( (j&(1<<(k-1))) && !(j&(1<<k)) ){//j的状态是10,显然不可能
                                ok=0;break;
                        }
                    }
                }
            if(ok)path[w][0]=i,path[w++][1]=j;
        }
}
int main(){
    while(cin>>n>>m,n){
        w=0;
        if(m>n)swap(n,m);
        get(m);
        memset(dp,0,sizeof dp);
        dp[0][(1<<m)-1]=1;
        for(int i=0;i<n;i++)
            for(int j=0;j<w;j++)
                dp[i+1][path[j][1]]+=dp[i][path[j][0]];
        printf("%lld\n",dp[n][(1<<m)-1]);
    }
} 

原文地址:https://www.cnblogs.com/zsben991126/p/10359187.html

时间: 2024-08-04 06:38:55

poj2411 状态压缩-铺地板题型的相关文章

POJ2411 状态压缩

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

POJ2411——状态压缩+DFS——Mondriaan&#39;s Dream

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 r

POJ2411 Mondriaan&#39;s Dream(状态压缩)

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

HihoCoder第九周 状态压缩 二 与POJ2411总结

在此我向各位博友求助,特别想知道除了HihoCoder上面的结果要对1e9+7取余之外,这两道题还有什么其他的问题,都是骨牌覆盖问题,都是状态压缩+dp,为什么我能过poj2411的程序过不了HihoCoder,还不是其他诸如TimeLimited,而是Wrong Answer,这个问题我想了很久,还是不知道是怎么回事,如果有神通广大的博友知道答案,希望你能告诉我.顺便说一下,HihoCoder给的那个hint只看懂了一部分递推的公式,其中满足的那个条件还是不懂. 两个题目的连接地址: http

Mondriaan的梦(状态压缩dp)

题目原题可以看POJ2411,大意是给出m*n的矩形,要用2*1的矩形将它铺满(不能讲一个矩形铺在另外一个上面),求方案数,并且只要不是完全相同的就算不同的方案,也就是对称算不同的方案. F[i][s]表示前i-1行已经填满,并且第i行的状态是s的方案数. F[i][s]=sum(F[i-1][s’]): s‘能转移到s.如何根据s来确定s'呢.这里用一个dfs实现,一位一位去填充s'.扫描s,如果该位是1,那么s’对应的这位必定是0,如果该位是0,那么要分情况讨论: 如果该位的后面一位也是0,

算法练习系列—hiho1048 状态压缩一(铺地砖)

题目地址:http://hihocoder.com/problemset/problem/1048 编程之美的课后题也有一个和整个题目一样的.(P269) 题目 这个题目的题意很容易理解,在一个N*M的格子里,我们现在有两种类型的砖块,1 * 2和 2 * 1,问一共有多少种方案,可以将整个N*M的空间都填满. 最简单的例子就是下面的了: 编程之美中题目: 某年夏天,位于希格玛大厦四层的微软亚洲研究院对办公楼的天井进行了一次大规模的装修.原来的地板铺有 N×M 块正方形瓷砖,这些瓷砖都已经破损老

状态压缩动态规划总结

状态压缩是一个很广的概念,在OI中也有很多的应用,当我们把他应用到动态规划中,可以用来精简状态,节约空间,也方便转移.最常见的就是用二进制来表是状态,利用各种位移运算,就可以实现\(O(1)\)的转移.状压DP适用于“窄棋盘”上的DP,否则状态太多无法存下. POJ1185 炮兵阵地 题意:给一个\(N \times M\)的地形盘,有平原和山坡,要求在平原上部署尽量多的炮(攻击范围2),使得不互相攻击. 数据范围:N <= 100:M <= 10,符合条件.如何表示状态?按行DP,一个二进制

[POJ 2411] Mondriaan&#39;s Dream 状态压缩DP

题意 给定一个 n * m 的矩形. 问有多少种多米诺骨牌覆盖. n, m <= 11 . 实现 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #define F(i, a, b) for (register int i = (a); i <= (b); i++) 6 #define LL long long 7 inline

(hiho1048)POJ2411Mondriaan&#39;s Dream(DP+状态压缩 or 轮廓DP)

问题: 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 rectangle