状态压缩DP——蒙德里安的梦想

news2024/9/22 15:38:28

状态压缩DP——蒙德里安的梦想

  • 一、题目描述
  • 二、思路分析
    • 1、状态表示——状态压缩
    • 2、状态转移
    • 3、循环
    • 4、初始化
  • 三、代码

一、题目描述

在这里插入图片描述

二、思路分析

这道题中,其实刚一看是非常的抽象的,也是非常麻烦的。麻烦的点在于我们既需要考虑横着放的方块,又需要考虑竖着放的方块。

但是我们注意到,只要我们放好横着放的方块,竖着的方块的放法是唯一确定的,因此我们只需要考虑横放的方块

这道题我们采用动态规划的方式来做,而动规的核心思路就是枚举子问题,利用子问题来解决当前的问题,那么这道题的子问题是什么呢?
在这里插入图片描述
我们不动行数,让列数从小到大增大,列数较小的看作子问题。

然后我们如何拜访横着的方块呢?
在这里插入图片描述
我们方块的摆放上图的方式,即,当前列的某几行的方块延申到了下一列

那么我们如果两列一起看是不是就相当于在某几行放了一个方块。

但是并不是所有的方案都是合法的,比如下面这几种方法就是不合理的:

情况1:
在这里插入图片描述
在第i列的时候,我们让第一行延申,在第i+1列的时候,还让i+1延申,那么很显然最终构成的长方体是3*1,不合法。

情况2:
在这里插入图片描述
两个延申行中间的间隔是奇数,导致我们无法利用竖着的填充满。

1、状态表示——状态压缩

问题的关键是如何表示,某列是否延申,这里就要用到今天的重点,状态压缩 。即将一种状态压缩成二进制数。 什么意思呢?

我们规定:1代表延申,0代表不延申。
在这里插入图片描述
如上图所示,我们将上图中的一种状态压缩成了一个数字 j。所以 j j j就表示我们表格中的延申状态。

因此假设行数是 5 5 5行,我们只需要从 00000 00000 00000 11111 11111 11111去枚举每一种状态,然后我们判断是否合法即可。

而中间的状态枚举,即写一个循环 0 0 0 2 5 − 1 2^5-1 251

所以状态表示

f [ i ] [ j ] f[i][j] f[i][j]:共i列,且第i列向下一行延申的状态是j的所有方案数。

最终状态:

假设表格有k列,那么最终表示就是 f [ k ] [ 0 ] f[k][0] f[k][0],意思就是第k列不延申到下一列。

2、状态转移

假设我们下面的列数均合法,则:
f ( i , j ) = s u m ( f ( i − 1 , k ) )        ( j & k = 0 , j ∣ k 是合法状态 ) f(i,j)=sum(f(i-1,k))\ \ \ \ \ \ (j \& k=0,j|k是合法状态) f(i,j)=sum(f(i1,k))      (j&k=0jk是合法状态)

3、循环

外循环就是我们的列数,内循环就是我们每一列可能的延申情况。

4、初始化

第0列中延申0个,这种情况下,f[0][0]=1

三、代码

#include<iostream>
#include<cstring>
using namespace std;
const int N=15,M=1<<N;
long long dp[N][M];
bool st[M];
int n,m;
int main()
{
    while(cin>>n>>m,n||m)
    {
        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;
        }
        memset(dp,0,sizeof dp);
        dp[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(!(j&k)&&st[j|k])dp[i][j]+=dp[i-1][k];
                }
            }
        }
        cout<<dp[m][0]<<endl;
    }
    return 0;
}

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

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

相关文章

【Linux】shell命令以及运行原理和Linux权限的理解

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6b2;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0c;厚积而薄发 …

VBA之正则表达式(39)-- 提取规格数据(2/2)

实例需求&#xff1a;A列为某产品名称&#xff0c;现需要提取其中的规格数据&#xff0c;具体规则如下&#xff1a; 规格数据以如下关键字开头&#xff1a;RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2规则数据可能有多段&#xff08;截图中红色部分&#xff09;提取规格数据之后&…

SpringBoot简单功能分析,静态资源访问和静态资源配置原理解析

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 3、webjar 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 1、SpringMVC自动配置概览 官网Web (spring.io) Spring Boot provides auto-configur…

论文综述——UNIRE: A Unified Label Space for Entity Relation Extraction

UNIRE: A Unified Label Space for Entity Relation Extraction1 任务介绍2 UniRE模型3 实验4 总结1 任务介绍 过构建标签空间来对实体和关系进行联合抽取的方法。 实体关系抽取旨在提取文本中的实体并检测它们的实体类型&#xff0c;以及对每个实体对检测它们的关系。作者提…

MAX78000FTHR简单介绍与初次上手

特点 MAX78000FTHR是基于MAX78000的小型板微控制器单元&#xff08;MCU&#xff09;。 该 MCU 面向在边缘运行的人工智能 (AI) 应用程序。在这种情况下&#xff0c;“边缘”并不意味着技术的前沿&#xff08;尽管这就是芯片&#xff09;&#xff1b;这意味着靠近需要它的地方…

vector对于自定义类型的操作(memcpy浅拷贝问题)

目录 如果对于不涉及资源管理的自定义类型的操作&#xff08;Date&#xff09;&#xff1a; 对涉及资源管理类操作&#xff08;String&#xff09;&#xff1a; 一、插入四个元素&#xff08;代码正常编译没有任何资源泄露问题&#xff09; 二、当插入第五个元素时&#xf…

【C++进阶】Map 和 Set(详解)

&#x1f308;欢迎来到C专栏~~Map 和Set (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&am…

【JavaScript】DOM 的概念、获取DOM元素和操作元素属性

文章目录【JavaScript】DOM 的概念、获取DOM元素和操作元素属性一. 概念二. DOM 操作(1) 获取DOM元素的方式1. document 获取元素方法2. 通过 HTML5 新增的方法获取案例&#xff1a;登录界面密码显示与隐藏(2) 读写元素内部的结构内容1. 改变元素节点里的内容2. 改变元素节点的…

操作系统的基本概念、功能、目标

文章目录&#x1f380;前言&#xff1a;本篇博客知识总览&#x1fa82;操作系统所处位置&#x1f4d6;操作系统的概念&#x1f3af;操作系统的功能和目标&#x1fa85;1.操作系统作为系统资源的管理者&#x1fa85;2.操作系统作为用户与计算机硬件之间的接口&#x1fa85;3.操作…

连接数据库和简单操作数据库

连接数据库和简单操作数据库JDBC程序编写步骤创建一个演员表数据库表的连接前置工作五种连接方式方式五的配置文件配置文件里面的内容通过JDBC进行对actor表操作。ideal执行后的结果数据库actor表结果JDBC程序编写步骤 1.注册驱动-加载Driver类 2.获取连接-得到Connection 3.执…

【阶段一】Python快速入门04篇:运算符、循环语句、条件语句与函数

本篇的思维导图: 运算符 算术运算符 算术运算就是常规的加、减、乘、除类运算。下表为基本的算术运算符及其示例。 描述 代码

【C++常用容器】STL基础语法学习map容器

目录 ●map基本概念 ●map构造和赋值 ●map大小和交换 ●map插入和删除 ●map查找和统计 ●map排序&#xff08;map初始排序顺序为从小到大&#xff0c;用仿函数将其改为从大到小&#xff09; ●map基本概念 map中的所有元素都是pair&#xff0c;pair中第一个元素为key&a…

【WeThinkIn出品】2022年度总结

Rocky Ding公众号&#xff1a;WeThinkIn写在前面 【WeThinkIn出品】栏目专注于分享Rocky的最新思考与经验总结&#xff0c;包含但不限于技术领域。欢迎大家一起交流学习&#x1f4aa; 这篇文章发布的时候&#xff0c;应该已经是2023年了。在这里Rocky祝大家元旦快乐&#xff01…

前端最常用的几个线上设计网站

文章目录前言CoDesign 腾讯自研设计平台【墙裂推荐】蓝湖- 高效的产品设计协作平台【墙裂推荐】zeplin Deliver on the promise of design 【国外&#xff0c;不推荐】总结前言 随着IT技术的不断进步&#xff0c;很多团队都将很对线下工作转移到了线上&#xff0c;不仅便捷&a…

Ae 效果详解:毛边

Ae菜单&#xff1a;效果/风格化/毛边Effects/Stylize/Roughen Edges毛边 Roughen Edges效果可使得 Alpha 通道的边缘变粗糙&#xff0c;可以为图像添加各种边缘效果。通过分形影响改变边缘样式&#xff0c;并可增加颜色以模拟铁锈和其他类型的腐蚀。此效果可为文本或图形提供自…

算法之数组常见题目

数组是存储在连续内存空间上的相同类型数据的集合。在数组中可以方便地通过下标索引的方式获取对应的数据。 需要注意的是&#xff1a; 数组的下标都是从0开始的。数组在内存空间是连续的&#xff0c;所以删除或者增添元素时难免要移动其他元素的地址&#xff0c;只能覆盖。 …

【Kubernetes | Pod/容器】如何修改 Pod 中容器的守护进程

目录题1. 环境设定1.1 创建名为 vmware-nginx 的 Pod2. 查看容器默认守护进程2.1 查看容器所在节点2.2 查看容器ID2.3 查看容器中运行的进程信息3. 修改容器默认守护进程3.1 类比 Docker3.2 修改 YAML 文件改变默认守护进程参数说明4. 验证4.1 删除旧的 vmware-nginx.yaml 容器…

质性分析软件nvivo的学习(一)

1、软件安装&#xff1a; 科研也是需要投资的&#xff0c;建议淘宝购买软件,价格60米。 2、软件基础使用说明&#xff1a; 说明&#xff1a;以下笔记来源都是通过B站视频自学总结的&#xff0c;您可以选择通过下面的B站视频学习&#xff0c;也可以选择通过我总结的内容速学。…

(Week 9)图论(C++,Dijkstra,Floyd)

文章目录【深基18.例3】查找文献&#xff08;C&#xff0c;图的遍历&#xff09;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1解题思路&#xff1a;【模板】floyd&#xff08;C&#xff09;题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样…

内核内存管理

1.内核内存管理框架 内核将物理内存等分成N块4KB&#xff0c;称之为一页&#xff0c;每页都用一个struct page来表示&#xff0c;采用伙伴关系算法维护 内核地址空间划分图&#xff1a; 3G~3G896M&#xff1a;低端内存&#xff0c;直接映射 虚拟地址 3G 物理地址 细分为&a…