C++ 动态规划 状态压缩DP 蒙德里安的梦想

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

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

如下图所示:

2411_1.jpg

输入格式
输入包含多组测试用例。

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

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

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

数据范围
1≤N,M≤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
在这里插入图片描述
我们需要求出的横向小方格的合法摆放方案数,然后剩下的格子就依次摆放纵向小方格即可。

用 f[i][j] 表示在第 i 列的状态为 j (j是一个二进制数)时的方案数。st[i] 表示状态 i 是否合法,合法的状态是指没有连续奇数个 0 的状态。这个预处理的目的是为了后续的动态规划转移时判断是否可以将当前状态转移到下一状态。

接下来进入动态规划的过程:

首先初始化第一列 f[0][0] = 1,表示在第一列没有任何骨牌时,只有一种覆盖方法。

然后从第二列开始遍历到第 m 列,对于每一列,遍历当前状态 j,以及上一列的状态 k。如果满足以下条件:

j 和 k 没有交集(即 (j & k) == 0),这保证了当前列和上一列没有重叠的部分;
j 和 k 组合在一起的状态是合法的(即 st[j | k] == true),这保证了新状态的合法性。
那么就可以将上一列的方案数加到当前状态上,即 f[i][j] += f[i - 1][k]。

最后,输出 f[m][0],即在最后一列状态为空时的方案数,即为答案。

这样,通过动态规划遍历每一列、每一种状态的组合情况,得到的 f[m][0] 即为棋盘被完全覆盖的方案数。

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 12, M = 1 << N;
long long f[N][M];
bool st[M];int main ()
{int n, m;while(cin>>n>>m, n || m){memset(f, 0, sizeof f);for(int i = 0; i < 1 << n; i ++ ) // 预处理一下所有的状态是不是存在连续奇数个0,枚举所有状态{st[i] = true;int cnt = 0; // 当前这一段0的个数for(int j = 0; j < n; j ++ ) // 枚举每一位if(i >> j & 1) //如果当前位为1,说明上一段0已经截止了{if(cnt & 1) st[i] = false; //说明上段存在奇数个0,不合法cnt = 0; //重新置0,用于下一段判断}else cnt ++;if(cnt & 1) st[i] = false; // 判断剩余的一段0}f[0][0] = 1;for(int i = 1; i <= m; i ++ ) // 枚举每一列for(int j = 0; j < 1 << n; j ++ ) // 枚举当前i列每个状态for(int k = 0; k < 1 << n; k ++ ) // 枚举i - 1列的每个状态if((j & k) == 0 && st[j | k]) // 判断转移条件,首先不能冲突,其次是合法状态(j或k就是当前放完的状态)f[i][j] += f[i - 1][k];printf("%lld\n", f[m][0]); //f[i][j] 表示在第 i 列(从 0 开始计数)且状态为 j 的情况下,合法的排列总数//而题目要求的是在最后一列(第 m 列)且状态为全 0 的情况下的排列总数,因此答案存放在 f[m][0] 中}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OCR文本纠错思路

文字错误类别&#xff1a;多字 少字 形近字 当前方案 文本纠错思路 简单&#xff1a; 一、构建自定义词典&#xff0c;提高分词正确率。不在词典中&#xff0c;也不是停用词&#xff0c;分成单字的数据极有可能是错字&#xff08;少部分可能是新词&#xff09;。错字与前后的…

uniapp设置不显示顶部返回按钮

一、pages文件中&#xff0c;在相应的页面中设置 "titleNView": {"autoBackButton": false} 二、对应的页面文件设置隐藏元素 document.querySelector(.uni-page-head-hd).style.display none

计算机网络实验四

实验四 VLAN划分与配置 1、实验目的 • 理解并掌握Port Vlan的配置方法 • 理解并掌握掌握跨交换机实现VLAN的配置方法 2、实验设备 &#xff08;1&#xff09;实验内容1&#xff1a;交换机端口隔离—Port Vlan的配置 以太网交换机一台笔记本电脑一台PC机两台配置电缆、网…

收藏:相当大赞的来自 Agilean产品团队的2篇关于重塑敏捷组织的绩效管理的文章

Agilean产品团队&#xff0c;是吴穹博士领导下最近在国内敏捷界很厉害的产品&#xff0c;今天看到两篇相当不错的说敏捷组织的上下篇文章&#xff0c;分享下&#xff0c;地址是&#xff1a;6个原则15项举措&#xff0c;重塑敏捷组织的绩效管理&#xff08;上&#xff09; 6个原…

星宸科技SSC8826Q 驾驶辅助(ADAS)行车记录仪方案

星宸科技SSC8826Q 驾驶辅助&#xff08;ADAS&#xff09;行车记录仪方案 一、方案描述 SSC8826Q是高度集成的行车记录仪、流媒体后视镜解决方案&#xff0c;主芯片为ARM Cortex A53&#xff0c;dual core&#xff0c;主频高达1.2GHz&#xff0c;集成了64-bit dual-core RISC 处…

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步&#xff1a;将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

如何有效的向 AI 提问 ?

目录 〇、导言 一、Base LLM 与 Instruction Tuned LLM 二、如何提出有效的问题 &#xff1f; 1. 明确问题&#xff1a; 2. 简明扼要&#xff1a; 3. 避免二义性&#xff1a; 4. 避免绝对化的问题&#xff1a; 5. 利用引导词&#xff1a; 6. 检查语法和拼写&#xff1…

哈希加密Python实现

一、代码 from cryptography.fernet import Fernet import os import bcrypt# 密钥管理和对称加密相关 def save_key_to_file(key: bytes, key_path: str):with open(key_path, wb) as file:file.write(key)def load_key_from_file(key_path: str) -> bytes:if not os.path…

【芯片设计- RTL 数字逻辑设计入门 7 -- 同步复位与异步复位详细介绍】

文章目录 复位的类型和划分同步复位综合后电路优缺点 异步复位优缺点 异步复位的时序分析&#xff08;recovery time/removal time&#xff09;异步复位&#xff0c;同步释放综合后电路优缺点 转自&#xff1a;https://blog.csdn.net/qq_40281783/article/details/128969188 复…

docker部署笔记系统flatnotes

效果 安装 创建目录 mkdir -p /opt/flatnotes/data && cd /opt/flatnotes/ chmod -R 777 /opt/flatnotes/ 创建并启动容器(可以自己修改账户和密码) docker run -d \ --restart unless-stopped \ --name flatnotes \ -p "10040:8080" \ -v "/dat…

JavaEE企业级应用软件开发—Spring框架入门学习笔记(一)

一、认识框架 实际开发中&#xff0c;随着业务的发展&#xff0c;软件系统变得越来越复杂&#xff0c;如果所有的软件都从底层功能开始开发&#xff0c;那将是一个漫长而繁琐的过程。此外&#xff0c;团队协作开发时&#xff0c;由于没有统一的调用规范&#xff0c;系统会出现大…

Unity类银河恶魔城学习记录3-4 EnemyBattleState P50

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic; …

@ResponseBody

目录 概述 用途 使用案例 用 ResponseBody 设置返回值 概述 ResponseBody注解的作用是将方法返回的对象&#xff0c;通过适当的转换器(HttpMessageConverter)转换为指定的格式之后&#xff0c;写入到response对象的body区&#xff0c;通常用来返回JSON数据或者是XML数据 用…

外汇天眼:欧洲期货交易所(Eurex)推出了基于EURO STOXX 50指数股息期货的中期期权

欧洲期货交易所&#xff08;Eurex&#xff09;将于2024年2月5日推出基于EURO STOXX 50指数股息期货的中期期权&#xff0c;扩大了其股息衍生品的产品线。 目前作为场外交易产品的中期期权&#xff08;Mid-Curve Options&#xff09;现在可以在Eurex进行交易。 中期期权&#x…

使用 openpyxl 操作 Excel

由于单位有任务&#xff0c;需要按照名册制作多个工作表。手动复制和修改内容太费事了&#xff0c;所以使用python完成此项工作&#xff0c;为之后的此类工作提供一个通用脚本。 安装依赖库 pip install openpyxl lxml我们需要用到openpyxl。在官方文档中提到&#xff0c;如果…

摘录笔记——2024年2月5日

美团三年&#xff0c;总结的10条血泪教训在美团的三年多时光&#xff0c;如同一部悠长的交响曲&#xff0c;高高低低&#xff0c;而今离开已有一段时间。闲暇之余&#xff0c;梳理了三年多的收获与感慨&#xff0c;既是对过去一段时光的的一个深情回眸&#xff0c;也是对未来之…

「牵手」联合国,看这家企业如何推动厕所可持续发展

作者 | 叶蓁 来源 | 洞见新研社 “没有人是一座孤岛&#xff0c;每个人都是广袤大陆的一部分。”英国诗人的这句话&#xff0c;用来形容当下的消费市场再准确不过。 当前&#xff0c;正是国家增强经济活力、发展内生动力的关键时期。2023年&#xff0c;我国全年GDP增速5.2%&…

Linux-3进程概念(一)

1.冯诺伊曼结构 1.1 冯诺依曼结构的概念 冯诺依曼结构&#xff0c;又称为普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置&#xff0c;因此程序指令和数据的宽度相同&…

Django连接Mysql

修改setting.py配置文件 连接前&#xff0c;需要创建数据库 安装mysql客户端 因为连接需要一个客户端&#xff0c;而python没有客户端&#xff0c;所以就需要一个客户端来接收你填写的参数 pip install mysqlclient