E - 积木画(状态压缩DP)

E - 积木画(状态压缩DP)

1、问题

E - 积木画

2、分析

这道题很明显是一道DP题,而且是一个简化版的状态压缩DP。

(1)状态表示

f [ i ] [ j ] f[i][j] f[i][j]表示前面 i − 1 i-1 i1已经摆好,并且第 i i i列的状态是 j j j的条件下,所有的摆法数量。·
为什么这里是 i − 1 i-1 i1呢,请看下面的讲解。

(2)状态转移

在状态转移之前,我们先看如下规定:
在这里插入图片描述

很明显, f [ i ] [ j ] f[i][j] f[i][j] f [ i + 1 ] [ j ] f[i+1][j] f[i+1][j]是两个截然不同的状态,那么当我们在第 i i i列放积木的时候,由于积木形状的特殊性,我们不难发现,第 i i i列放的积木会影响到第 i + 1 i+1 i+1列的状态,而正是这种影响在两个截然不同的状态之间搭建起了一个桥梁,即实现了状态的转移,因此我们接下来的讨论就是根据第 i i i列的不同的积木的摆法,去写转移方程。

在讲解之前,我们需要给各个状态做一下标记:
详细地状态规定如下图所示:
在这里插入图片描述
现在开始直接讨论 i i i i + 1 i + 1 i+1列的两种状态。

我们去枚举第 i i i列的所有状态,黑色表示 i i i列自带的状态,红色和橙色表示我们在第 i i i列所有能填的情况。所有的情况如下图所示:
在这里插入图片描述

将上图转化为状态转移方程:
f [ i + 1 ] [ 0 ] = f [ i ] [ 0 ] + f [ i ] [ 3 ] f [ i + 1 ] [ 1 ] = f [ i ] [ 0 ] + f [ i ] [ 2 ] f [ i + 1 ] [ 2 ] = f [ i ] [ 0 ] + f [ i ] [ 1 ] f [ i + 1 ] [ 3 ] = f [ i ] [ 0 ] + f [ i ] [ 1 ] + f [ i ] [ 2 ] + f [ i ] [ 3 ] f[i+1][0]=f[i][0]+f[i][3] \\f[i+1][1]=f[i][0]+f[i][2] \\f[i+1][2]=f[i][0]+f[i][1] \\f[i+1][3]=f[i][0]+f[i][1]+f[i][2]+f[i][3] f[i+1][0]=f[i][0]+f[i][3]f[i+1][1]=f[i][0]+f[i][2]f[i+1][2]=f[i][0]+f[i][1]f[i+1][3]=f[i][0]+f[i][1]+f[i][2]+f[i][3]

(3)初末状态

初始状态的话,我们只需要让 f [ 1 ] [ 0 ] = 1 f[1][0] = 1 f[1][0]=1即可。即我们在第 1 1 1列没有积木填充的方案数是 1 1 1。为什么呢?
因为当前列的状态是由前一列的积木的放置状况决定的,而第 0 0 0列不存在,所以没法放积木,所以第 1 1 1列的状态只有 0 0 0是合法的。
末状态即 ( f [ n ] [ 3 ] + f [ n ] [ 0 ] ) (f[n][3] +f[n][0]) (f[n][3]+f[n][0])或者写作 f [ n + 1 ] [ 0 ] f[n+1][0] f[n+1][0]

这里解释一下为什么前面要写成 f [ n ] [ 3 ] + f [ n ] [ 0 ] f[n][3]+f[n][0] f[n][3]+f[n][0]
因为如果第 i i i列是空的,所以我们可以自动填充一个竖着的积木即可。

(4)滚动数组优化

由于这道题的数据范围很大,我们的DP数组可能存不下,而我们发现我们每次存储都只用到了上一层的数据,对于上一层之前的数据其实是没有用的,也就是说我们只需要在两层之间不断地迭代滚动即可,无需开这么大的空间。
那么滚动的方法即我们将下标和1取 & \& &运算即可。

3、代码

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long 
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
int f[3][4];

void solve()
{
	int n;
	cin >> n;
	f[1][0] = 1;
	for(int i = 1; i <= n; i ++ )
	{
		f[i + 1 & 1][0] = (f[i & 1][0] + f[i & 1][3]) % mod;
		f[i + 1 & 1][1] = (f[i & 1][0] + f[i & 1][2]) % mod;
		f[i + 1 & 1][2] = (f[i & 1][0] + f[i & 1][1]) % mod;
		f[i + 1 & 1][3] = (f[i & 1][0] + f[i & 1][1] + f[i & 1][2]) % mod;
	}
	cout << f[n + 1 & 1][0] << endl;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	solve();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第七讲 贪心

文章目录股票买卖 II货仓选址&#xff08;贪心:排序中位数&#xff09;糖果传递&#xff08;❗贪心&#xff1a;中位数&#xff09;雷达设备&#xff08;贪心排序&#xff09;付账问题&#xff08;平均值排序❓&#xff09;乘积最大&#xff08;排序/双指针&#xff09;后缀表达…

SpringBoot——基于SpringBoot整合Mybatis的入门案例+sql提示配置

开发流程图 先选择springboot项目创建&#xff0c;此处3.0以上的springboot项目最低都要java17版本 让数据库表中的属性名和实体类中的属性名保持一致就可以完成查询结果的自动封装。 2.引入myabtis相关依赖&#xff0c;配置mybatis 这里可以手动选择mybatis框架的依赖和mysq…

常见的卷积神经网络结构——分类、检测和分割

本文持续更新~~ 本文整理了近些年来常见的卷积神经网络结构&#xff0c;涵盖了计算机视觉领域的几大基本任务&#xff1a;分类任务、检测任务和分割任务。对于较复杂的网络&#xff0c;本文只会记录其中的核心模块以及重要的网络设计思想&#xff0c;并不会记录完整的网络结构。…

POM依赖报错解决方案汇总

POM依赖报错解决方案汇总 POM依赖报错解决方案汇总 状况 1 创建完一个maven项目,在pom文件在引入依赖,等下方自动导入加载完毕,去查看IDEA工具的Maven Projects工具选项中Dependencies 依然后依赖红色报错 2 在pom文件中,引用依赖后,该依赖的版本号处直接出现红色 3 IDEA工具…

蓝桥杯Web前端练习题-----水果拼盘

一、水果拼盘 介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.…

值得记忆的STL常用算法,分分钟摆脱容器调用的困境,以vector为例,其余容器写法类似

STL常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric>组成 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、交换、查找、遍历操作、复制、修改等等 <nuneric>体积很小&#xff0c;只包括…

【AWS入门】通过AWS存储网关(Storage Gate Way)实现文件共享

目录1. 创建网关2. 创建文件共享3. Windows文件共享4. LINUX文件共享1. 创建网关 配置缓存存储需要加载一会儿&#xff0c;此处需要等候 根据上述配置&#xff0c;会自动生成一个EC2实例 2. 创建文件共享 网关&#xff1a;选择上述步骤中创建的网关&#xff0c;选择即可 文…

电路设计的一些概念

锁存器的产生 论述1 (转)时序电路&#xff0c;生成触发器&#xff0c;触发器是有使能端的&#xff0c;使能端无效时数据不变&#xff0c;这是触发器的特性。 组合逻辑&#xff0c;由于数据要保持不变&#xff0c;只能通过锁存器来保存。 第一个代码&#xff0c;由于是时序逻…

基于XML的自动装配~

基于XML的自动装配之场景模拟&#xff1a; 自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或者接口类型赋值 之前我们学过的依赖注入&#xff0c;我们在为不同属性赋值时&#xff0c;例如类类型的属性…

可别再用BeanUtils了(性能拉胯),试试这款转换神器

老铁们是不是经常为写一些实体转换的原始代码感到头疼&#xff0c;尤其是实体字段特别多的时候。有的人会说&#xff0c;我直接使用get/set方法。没错&#xff0c;get/set方法的确可以解决&#xff0c;而且也是性能较高的处理方法&#xff0c;但是大家有没有想过&#xff0c;要…

数据结构与算法——堆的基本存储

目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大…

MySQL主从复制

主从复制概述 如何提升数据库并发能力 在实际工作中&#xff0c;我们常常将 Redis 作为缓存与 MySQL 配合来使用&#xff0c;当有请求的时候&#xff0c;首先会从缓存中进行查找&#xff0c;如果存在就直接取出。如果不存在再访问数据库&#xff0c;这样就 提升了读取的效率&…

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

【简陋Web应用2】人脸检测——基于Flask和PaddleHub

文章目录&#x1f6a9; 前言&#x1f33a; 效果演示&#x1f966; 分析与设计&#x1f349; 实现&#x1f36c; 1. 部署人脸检测模型&#x1f36d; 2. 使用Flask构建app2.1 目录结构2.2 forms.py2.3 utils.py2.4 app.py2.5 index.html&#x1f95d; Bug(s)&#x1f6a9; 前言 本…

V2G模式下含分布式能源网优化运行研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;&#x1f381;&#x1f381;&#x1f381; 目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &am…

手写一个简单的RPC框架

学习RPC框架&#xff0c;由繁化简&#xff0c;了解其本质原理 文章目录项目简介什么是RPC&#xff1f;项目模块项目代码common模块client模块server模块framework模块测试项目简介 什么是RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff09;即远程过程调用&am…

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…

SWA Object Detection随机权重平均【论文+代码】

随机权重平均摘要IntroductionSWA实验部分消融实验摘要 您想在不增加推断成本和不改变检测器的情况下提高对象检测器的1.0 AP吗&#xff1f;让我们告诉您一个这样的秘方。这个秘方令人惊讶地简单&#xff1a;使用循环学习率训练您的检测器额外的12个epoches&#xff0c;然后将…

最强的Python可视化神器,你有用过么?

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 1、Plotly Plotly是一款用来做数据分析和可视…

【数据结构】Java实现队列与循环队列

目录 1. 概念 2. 队列的使用 3. 自己动手实现队列 3.1 MyQueue接口 3.2 LinkedQueue类 3.3 入队列 3.4 出队列 3.5 获取队头元素 3.6 获取队列中有效元素个数与检测队列是否为空 3.7 toString方法 4. 整体实现 4.1 LinkedQueue类 4.2 Test类 4.3 测试结果 5. 循…
最新文章