2022年蓝桥杯省赛软件类C/C++B组----积木画

news2024/11/29 13:47:27

想借着这一个题回顾一下动态规划问题的基本解法,让解题方法清晰有条理,希望更多的人可以更轻松的理解动态规划!

目录

【题目】

【本题解题思路】

【DP模版】

总体方针:

具体解题时的套路:


 【题目】

 

  【本题解题思路】

———类似题目:覆盖墙壁 - 洛谷(很多经典题解在里面)

1、确定子状态:

我最终要求解的是:用两种类型的积木将2 x n的画卷填满时有着多少种组合方案。(围绕最终要求解的问题确定子问题)

所以子问题应该是在长度为n的情况下有多少种解法。

所以用一维数组dp[i] 存储长度为i 时的方案数。

2、确定转移的边界情况和初始状态:

这里先正着推,已知n=3时dp[3]=5,那么就可以先明确n=1,n=2时对应的dp[i],即dp[1]=1,dp[2]=2;

然后发现没有什么明显的规律呢,那就再倒着来

3、确定状态转移方式:

为了方便表述,设画卷长度为len;

我想知道画卷长度为len=n时的值,那么我就找他的上一层 len=n-1时的状态,看看有没有什么关联。为了形成填满画卷的状态,我的最后一块位置可以怎么摆放积木呢,从积木的两种类型出发,发现他可以形成四种状态。这里用分类的思想将所有的选择罗列出来,找规律。

如图所示,最后一次有如下选择:

(1)最后一次选竖着的I ,那么dp[n]=dp[n-1]。

因为最后一位固定好了就这一种选择,即1*dp[n-1]。如图1;

(2)最后一次选横着的I ,那么为了填补上画卷,第二行也只能选横着的I 这两个横着的I作为一个整体是一种填补画卷的方式。此时dp[n]=dp[n-2];

如图2所示。

前两种状态都很明显,但是如果选用L形的怎么罗列呢:

(3)L型垂直翻转前后算两种状态,如图3、4.  下面仅根据其中的一种情况来讨论,最后因为翻转所有的结果×2 即可。

A.可以用两个L形成长度为3的整体来填补画卷,dp[n]=dp[n-3],如图5;

B.采用两个L和一个横着的I的方式形成一个整体作为一种方法填补,dp[n]=dp[n-4],如图6;

C.同上,还可以采用在两侧两个L中间包裹多个横着的I的方式来填补,每多一个横着的I相当于这个用于填补的图像整体的长度+1。所以类推得到dp[n]=dp[n-5],dp[n-6],...  如图7;

综上所述,形成填满画卷的前一个整体的状态可以采用如上这些方式,所以他的方案总数就有:

dp[n]=dp[n-1]+dp[n-2]+2*(dp[n-3]+dp[n-4]+...dp[0]);

假如用前缀和sum[n]表示前n个长度的方案总和,dp[n]=sum[n-1]+sum[n-3];

但是我这里只求了n=1---3的情况,n=4时情况虽然有点复杂,但是也还是不好求(哈哈)。

所以有没有什么化简的方式呢,大家记不记得高考时第一个大题考的数组的性质,这里就可以用来变换公式;

dp[n]=sum[n-1]+sum[n-3];

dp[n-1]=sum[n-2]+sum[n-4];

上下相减发现  dp[n]-dp[n-1]=dp[n-1]+dp[n-3];

所以,dp[n]=2*dp[n-1]+dp[n-3]   

这就把递推公式推出来了,完美撒花!

【DP模版】

总体方针:

凡是动态规划问题,可以从以下三个角度考虑,确定求解问题的基本思路:

(有时是二维问题或者多维问题时可以考虑用二维或者多维数组)

动态规划问题具有两个性质:

(1)无后效性:每个子问题的解都是基于之前子问题的解,而不受后续子问题解的影响。这意味着我们可以独立地解决每个子问题,然后将这些解组合起来形成一个最优解。即当前状态的解只受此状态之前(就是过去的状态)的影响,一经确定,未来的状态不影响当前状态的结果。

(换成人话就是,当前状态的结果是由之前状态形成的,一旦确定,后续的状态对他没有影响)

(2)子问题重叠性:每个子问题之间类似于嵌套的关系,我想求这个子问题,就必须先解决比他规模更小的、具有同样规律的子问题。

具体解题时的套路:

1、按照题目的求解问题,确定子问题是什么,把存储每个子问题的数据结构定义出来;

2、根据题目中给的信息,自己推理、枚举出来所有的可以获得的关于解的信息,看看是否存在什么规律。这里推倒的方式往往是从边界开始往前推导,观察前后状态之间的联系。或者是从初始状态向后推导,找规律。


 

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

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

相关文章

压缩列表ziplist

目录 1压缩列表的结构 2.压缩列表节点的构成 previous_entry_length encodeing conent 3.压缩列表API 1.创建列表 ziplistNew 2.正向遍历 ziplistNext 3.反向遍历 ziplistPrev 4.插入元素 ziplistInsert 5.级联更新 __ziplistCascadeUpdate 6.删除节点 7.查找entr…

L2-2 巴音布鲁克永远的土(二分+并查集)

思路:我们可以二分答案,然后判断当前答案合不合理。 对于判断答案合理,可以用并查集,看mid能否把所有检查点连进一个集合中,枚举每个结点,如何当前结点周围的四个方向可以连的话,就加进同一个集…

host文件nginx代理 综合理解

之前一直理解得很糙 导致遇到问题很迷糊 今天经过大佬两句话讲明白了 特此记录 host文件 首先host做了代理 也就是对浏览器的DNS寻址做了拦截 具体原理可以参照当我们在地址栏输入URL的时候浏览器发生了什么 例如127.0.0.1 www.baidu.com 将 127.0.0.1 www.baidu.com 链接自…

DHCP抓包分析

DHCP动态路由配置协议,是C/S架构,由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程: 如何解决IP地址的冲突: ▫ DHCP服务器端:收到DHCP DISCOVER报文时,给客户端分配IP地址前会发…

有关NVIDIA 4090的pytorch版本安装心得

目录 1.查看版本2.安装对应版本的pytorch3.检测是否安装成功4.问题 1.查看版本 输入 nvidia-smi 查看GPU支持的cuda最高版本 如上图所示,你的GPU支持的最高CUDA版本便为12.2,所以你要安装CUDA版本不能高于该版本。安装版本不能太低,建议就小…

高阶流程图(SIPOC)

SIPOC高阶流程图是一种流程映射和改进方法,它使用可视化的方式描述一个或多个流程的输入和输出。SIPOC是五个单词的首字母缩写,分别代表供应商(Suppliers)、输入(Inputs)、过程(Processes&#…

python使用概率算法模拟寻找伴侣

对于模拟寻找伴侣的问题,人在特定时期内能够遇见的异性是有限的,假设在某段时期内能够遇见的异性人数是n,那么问题在于在不能全面对n位候选人进行评估的情况下,以最大概率选中最好的那位。 假设n位候选人的水平用n个不同的数值表示,数值越大表示其水平则越高,问题在于,…

深入剖析Tomcat(一) 实现一个简单的Web容器

前言 在Java生态中,Tomcat的应用可谓经久不衰,众多Java Web应用都依赖它来进行部署。 虽然我们经常使用它,但是如果不深入了解的话,它对我们来说就一直是一个黑盒。就单纯的作为一个使用者来说,肯定也知道它内部应用…

Win10下安装Anaconda

Anaconda是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本,它包含了conda、Python在内的超过180个科学包及其依赖项。 安装Anaconda Anaconda官方下载网址:https://www.anaconda.com/download 官网页面中&#xff0c…

探究 ChatGPT 的心脏--Transformer(基础知识第一篇)

Transformer 是 ChatGPT 的核心部分,如果将 AI 看做一辆高速运转的汽车,那么 Transformer 就是最重要的引擎。它是谷歌于 2017 年发表的《Attention is All You Need》中提出的 Sequence-to-sequence 的模型,诞生之后便一统江湖,在…

【考研数学】《660》+《880》高分搭配方法

📝《660题》和《880题》高效刷题方法 1️⃣做题要有针对性,不要为了做题而做题 💪660和880题虽然多,但是你不用全都做完,你可以把它当成是题源,里面的每一道题都很经典,如果搞懂一道&#xff…

51蓝桥杯之DS18B20

DS18B20 基础知识 代码流程实现 将官方提供例程文件添加到工程中 添加onewire.c文件到keil4里面 一些代码补充知识 代码 #include "reg52.h" #include "onewire.h" #include "absacc.h" unsigned char num[10]{0xc0,0xf9,0xa4,0xb0,0x99,…

最近一些前端面试问题整理

最近一些前端面试问题整理 4月8号1. TS 中的 类型别名 和接口的区别是什么?2. 什么是深拷贝和浅拷贝?深浅拷贝的方法有哪些?浅拷贝(Shallow Copy)深拷贝(Deep Copy)区别总结 3. 使用 JSON.strin…

如何在淘~宝接单和解决别人问题-java开发

如下这是一个连接:https://s.tb.cn/c.0vDtL3https://s.tb.cn/c.0vDtL3 解决各种问题。可付费咨询

炒股自动化:交易接口API才是重点,券商官方散户可用的接口

上一篇我们用get_full_tick取到了数据,也讲了变量和字典的基本概念,这次我们向交易所发送订单试试。前面文章的链接放在文末了,需要的可以看一下 这些内容是给新手看的,找接口的大佬们直接拉到文末即可 取市场数据的方法很多&am…

查询优化-ANY类型子连接提升

瀚高数据库 目录 文档用途 详细信息 文档用途 已知查询树基本结构的基础上,在一定条件下对SQL中的子连接提升, 详细信息 子连接提升流程 SQL: SELECT sname FROM student WHERE sno > ANY (SELECT sno FROM score);图1.1是该SQL对应的查询树&#…

代码随想录算法训练营第三十一天| 455.分发饼干、376.摆动序列、53.最大子序和

系列文章目录 目录 系列文章目录455.分发饼干贪心算法大饼干喂胃口大的(先遍历胃口)胃口大的先吃大饼干(先遍历饼干)小饼干先喂胃口小的(先遍历胃口)胃口小的先吃小饼干(先遍历饼干) 376. 摆动序…

为什么在学校很难真正学好嵌入式?

10几年前,我是读电气工程专业,学了很多东西,结构,电机、绘图,plc等等.. 其实,都没什么鸟用,出来还是像个废物。 后面我自学转了单片机开发,说句难听点,自己买个开发板都比在学校学得深。 可能是这个专业的问题,主攻不是嵌入式方向,老师用汇编点个流水灯,这门课就…

第四百五十三回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容,本章回中将介绍关于MediaQuery的优化.闲话休提,让我们一起Talk Flutter吧。 1. 问题描述 我们在…