首页 > 其他分享 >蒙德里安的梦想

蒙德里安的梦想

时间:2023-04-03 22:58:44浏览次数:39  
标签:11 状态 cnt 梦想 蒙德里安 int 测试用例

蒙德里安的梦想

题目描述

求把 $ N × M $ 的棋盘分割成若干个 $ 1 \times 2 $ 的长方形,有多少种方案。

例如当 $ N=2,M=4 $ 时,共有 \(5\) 种方案。当 \(N=2,M=3\) 时,共有 \(3\) 种方案。

如下图所示:

2411_1.jpg

输入格式

输入包含多组测试用例。

每组测试用例占一行,包含两个整数 \(N\) 和 \(M\)。

当输入用例 \(N=0,M=0\) 时,表示输入终止,且该用例无需处理。

输出格式

每个测试用例输出一个结果,每个结果占一行。

数据范围

$ 1 \le N,M \le 11 $

输入样例:

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

输出样例:

1
0
1
2
3
5
144
51205


算法

(状压DP) \(O(n^2)\)

f[i][j]:第i列摆放横块的状态是j,其中j的定义是:如果当前行有一个横块,则当前二进制状态为1,否则是0

0列的状态j为:1010;第1列的状态j为:0101
每次状态转移是从前一个的状态转移到当前状态的一个合法途径。
合法途径是指:

  • i - 1列与i列没有重叠区域<=>i列的状态j“与”i - 1列的状态k0<=> j & k = 0 ;
  • i列能插入竖块<=>i列不存在连续奇数个0

时间复杂度

dont know

空间复杂度

dont know

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 12, M = 1 << N;
bool st[M];
long long f[N][M];
int n, m;


void cntstate(int n, int m)
{
    memset(st, false, sizeof st);
    for(int i = 0; i < 1 << n; i ++)
    {
        int cnt = 0;
        st[i] = true;
        for(int j = 0; j < n; j ++)
        {
            if(i >> j & 1)
            {
                if(cnt & 1)
                {
                    st[i] = false;
                    break;
                }
            }
            else cnt ++;
        }
        if(cnt & 1) st[i] = false;
    }
}



int main()
{
    while(cin >> n >> m, n || m)
    {
        cntstate(n, m);
    
        memset(f, 0, sizeof f);
        
        f[0][0] = 1;
        
        for(int i = 1; i <= m; i ++)
            for(int j = 0; j < 1 << n; j ++)
                for(int k = 0; k < 1 << n; k ++)
                    if((k & j) == 0 && st[k | j])
                        f[i][j] += f[i - 1][k];


        cout << f[m][0] << endl;
    }
    return 0;
}

标签:11,状态,cnt,梦想,蒙德里安,int,测试用例
From: https://www.cnblogs.com/bothgone/p/17284785.html

相关文章

  • 最强A9四核加成?魅族“梦想”机MX四核版评测
    魅族MX四核版是国内第一台四核智能手机,在今年的6月30号上市,首发时候一度引发各地排队购机的风潮,可见其人气之火爆。加上魅族的大力宣传,在香港的发布也得到足够的重视,甚至有老外买到MX后到论坛炫耀自己能第一时间完成root。它凭借靓丽的外观,超强的性能,良好的做工和给力的拍照吸引着......
  • Acwing 291. 蒙德里安的梦想
     状态压缩DP当把所有横向格子放完后,纵向方格的排放方案只有一种。因此整个划分方案数与横着摆放方格的方案数相同。f[i,j]表示,目前摆放第i列,j是二进制数(状态是整数,看......
  • 新征程是充满光荣和梦想的远征
    路虽远,行则将至;事虽难,作则必成。自勉,坚持每一天,一点点的改变,改变自己的行为习惯,改变自己的思想认知。坐在办公室里都是问题,下到基层全是解决办法。加油!给自己鼓鼓劲,向......
  • 物理学又不存在了?ChatGPT:室温超导是物理学的一个梦想
    大家好,我是小彭。就在前天,一组微信聊天记录突然开始在各大群中流传:随后,这一新闻直接引爆各大社交媒体,物理学又双叒叕不存在了吗?到底是什么重磅消息呢?原来在美国物理......
  • 梦想Android版CAD控件(安卓CAD二次开发,安卓CAD控件)2023.02.26更新
    下载地址:https://www.mxdraw.com/ndetail_40240.html1. 增加willBeReturnStart事件2. 增加使用OpenGL缓存3. 优化界面响应时间4. 修改在个别图纸上大量的小对象图块,缩......
  • Gridea,一个小而美的博客梦想桥梁
    欢迎到我自己搭建的博客查看最新最全的这篇文章,效果更佳~备注:本文叙述操作过程非常详细,会稍现冗长,可以适当的跳读。引子      相信大家应该已经非常了解GitHubp......
  • 蒙德里安的梦想
    #include<bits/stdc++.h>usingnamespacestd;constintN=15,M=1<<N;intn,m;boolst[M];longlongf[N][M];voidinit(){for(inti=0;i<1<<n;i++){......
  • 家长减负科学伴学,作业帮AI学习桌梦想家到底有何魅力?
    伴随科技的发展和新时代育儿方式的不断演变,越来越多的家长都意识到了智能学习工具的重要性。就拿目前市面比较火热的作业帮智能学习桌来说,其不仅能能让孩子矫正坐姿,预防近视......
  • 人生顿悟之梦想岂能丢掉
         清晨的马路,落叶飘洒,又是一个秋冬季,不知不觉,即将迎来新的一年----2014。2013,过得是那么的快,周而复始,难道就这样一直下去嘛。每一年都有一个梦想,年初总是信心满......
  • 场景编程集锦 - 吉米的总统梦想
    1.场景描述  吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路。  开学的第一堂课上,老师用白色的粉笔在黑板上写下了“我的梦想”,同学们......