关闭

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

标签: dp
207人阅读 评论(0) 收藏 举报
分类:

转送门:poj 2411 Mondriaan’s Dream

题目大意

给出一个n*m的棋盘,及一个小的矩形1*2,问用这个小的矩形将这个大的棋盘覆盖有多少种方法。

解题思路

因为对应于一个方格来讲,有两种状态放或者不放
对应于一个1*2的矩形来说有三种方式:横着放,竖着放,不放
因为列的数量为指数级别的,行为线性的,所以我们选取大的最为行,小的作为列
所有dp[i][j]就表示第i行状态为j的时候方法数
那么很明显dp[i][nowsta] = {dp[i-1][presta]}
对于每种2*1的矩形我们有下面的三种方式
1 横放

如果第i行第d列我们选择横放,那么第i行的第d列及d+1列都是1了,第i-1行第d列及d+1列也都必须为1(保证是满的),及状态转移为:

d=d+2,curstate=curstate<<2|3,prestate=prestate<<2|3.

2竖放

第i行第d列我们选择竖放,那么第i行第d列为1,第i-1行d列必须是0,(因为我们是竖着放的,如果前一行不是空的如何能放下呢),状态转移:

d=d+1,curstate=curstate<<1|1,prestate=prestate<<1.

3不放

第i行第d列不妨,那么第i-1行d列肯定是1,(保证是满的),状态转移:

d=d+1,curstate=curstate<<1,prestate=prestate<<1|1.

这个题目采用记忆化搜索,对已经计算出的状态值方法记录,还有就是初始化的时候将dp[0][2<

AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 12;
long long dp[MAXN][1<<MAXN];
int col,row;
void dfs(int r,int c,int preSta,int nowSta)
{
    if(c == col)
    {
        dp[r][nowSta]+=dp[r-1][preSta];
        return ;
    }
    if(c+1<=col)
    {
        dfs(r,c+1,preSta<<1,nowSta<<1|1);
        dfs(r,c+1,preSta<<1|1,nowSta<<1);
    }
    if(c+2<=col)
        dfs(r,c+2,preSta<<2|3,nowSta<<2|3);
}
int main()
{

    while(~scanf("%d%d",&col,&row) && row&&col)
    {
        if((col*row)%2)
        {
            printf("0\n");
            continue;
        }
        if(col>row) swap(col,row);
        memset(dp,0,sizeof dp);
        dp[0][(1<<col)-1] = 1;
        for(int i=1;i<=row;i++) dfs(i,0,0,0);
        printf("%lld\n",dp[row][(1<<col)-1]);
    }
    return 0;
}
0
0
查看评论

poj 2411 Mondriaan's Dream 【dp】

题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案。 分析:这是一个比较经典的题目,网上各种牛B写法一大堆。题解也是 我们可以定义状态:dp【i】【st】:在第 i 行状态为 s...
  • y990041769
  • y990041769
  • 2014-10-09 07:46
  • 1337

poj2411--Mondriaan's Dream(状压dp+dfs)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12315   Accepted: 7189 Descrip...
  • u013015642
  • u013015642
  • 2015-02-04 20:49
  • 837

POJ2411:Mondriaan's Dream(状态压缩)

Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet ser...
  • libin56842
  • libin56842
  • 2014-05-04 22:44
  • 2685

【POJ2411】Mondriaan's Dream-状态压缩DP(插头DP?)

【POJ2411】Mondriaan's Dream-状态压缩DP(插头DP?)
  • Maxwei_wzj
  • Maxwei_wzj
  • 2017-03-20 17:46
  • 258

poj2411 Mondriaan's Dream 插头dp做法

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11379   Accepted: 6...
  • smz436487
  • smz436487
  • 2014-07-25 13:56
  • 251

poj2411Mondriaan's Dream题解

题目大意:给出h*w(1≤h、w≤11)的方格棋盘,用1*2 的长方形骨牌不重叠地覆盖这个 棋盘,求覆盖满的方案数。 输入文件包含多组数据。 每组数据有一行,两个正整数h,w。 输入结束标志为h=w=0. 对每组数据,输出一行一个正整数,即方案总数。解析详见代码:#include<c...
  • qq_27138357
  • qq_27138357
  • 2015-08-01 17:43
  • 467

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

Mondriaan's Dream Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the ...
  • u014634338
  • u014634338
  • 2015-11-24 17:27
  • 886

POJ-2411-Mondriaan's Dream-轮廓线dp(插头dp)

题意:在n*m的方格里铺1*2的骨牌,有多少种可能,首先可以排除一些特殊情况,n*m是奇数,就是0 n或m是1就是1(已经排除n*m的情况)。然后就和我之前写的hdu1992的插头dp一样 #include #include #include #include #include using na...
  • lyc1635566ty
  • lyc1635566ty
  • 2016-08-09 00:31
  • 418

poj 2411 Mondriaan's Dream(状压dp)

题目链接题目描述: Mondriaan’s Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15058 Accepted: 8688 DescriptionSquares and rec...
  • fouzhe
  • fouzhe
  • 2016-07-30 16:29
  • 161

POJ 2411 Mondriaan's Dream(状压DP)

Mondriaan’s DreamTime Limit: 3000MSMemory Limit: 65536KTotal Submissions: 17936Accepted: 10285DescriptionSquares and rectangles fascinated the famous ...
  • Effervescence
  • Effervescence
  • 2017-10-13 17:50
  • 40
    个人资料
    • 访问:326010次
    • 积分:5182
    • 等级:
    • 排名:第6325名
    • 原创:218篇
    • 转载:12篇
    • 译文:1篇
    • 评论:29条
    最新评论