扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第74讲。

扎气球最高分,本题是2021年11月27日举办的第13届蓝桥杯青少组Python编程选拔赛真题编程部分第5题。题目要求对于给定的n个排成一排的气球,将所有气球扎破能够得到的最高分数。

先来看看题目的要求吧。

一.题目说明

编程实现:

小明去游乐场玩飞镖扎气球的游戏,一共有n个气球,依次排成一行,每个气球上有一个数字,表示这个气球的分值。

游戏计分规则:

1、戳破1个气球,将获得其本身及左右相邻气球,共三个分值相乘的分数;

2、如果戳破的气球左边或右边没有气球,则获得其本身及相邻气球,共两个分值相乘的分数;如果被戳破的气球左边和右边都没有气球(是最后一个被戳破的气球),则这个气球本身的分值作为分数;

3、已经被戳破的气球不再计算。

飞镖数量不限,可以任意选择顺序戳破气球,根据计分规则,争取使得游戏最后得分最高。

例如:一共有3个气球,分值分别为2,4,6。

若想获得最高得分:

1). 先戳破4,得分为2 x 4 x 6 = 48;

2). 再戳破2,得分为2 x 6 = 12,累计得分60;

3). 再戳破6,得分为6,累计得分66;

最后总得分为66,为最高得分。

输入描述:

输入n个正整数,表示气球的分值,且正整数之间以一个英文逗号隔开

输出描述:

输出正整数,表示戳破所有气球后获得的最高得分

样例输入:

2,4,6

样例输出:

66

二.思路分析

这是一道动态规划算法题,涉及的知识点包括循环、列表和动态规划等。

这是一个求最值问题,对于最值问题,常见的实现方案有枚举算法、贪心算法、递归算法、回溯算法和动态规划等。

那么你知道本题属于哪种类型呢?

实际上,这是典型的区间DP问题,区间DP问题通常涉及一个列表或数组,需要对其某些子区间进行操作,并通过这些操作的结果来求解整个列表或数组的某些性质或最优值。

区间DP的基本思想是通过定义二维的DP状态数组dp[i][j],表示从序列的第i个元素到第j个元素(即区间[i, j]的最优解,例如最小/最大的某个值)。然后,通过考虑如何将大区间分解成较小的区间,并利用这些较小区间的最优解来构造大区间的最优解,来进行状态转移。

对于动态规划问题,核心点有如下4个:

  • 定义dp数组

  • 初始状态

  • 状态转移方程

  • 遍历顺序

接下来,我们逐一分析这4个核心要素。

1. 定义dp数组

由于这是一个区间DP问题,因此dp数组是一个二维列表,即dp[i][j],表示扎破从i到j之间所有的气球的最高得分。

此时,有一个问题需要明确,这里的i和j是否也包含呢?

我们看一组实际的数据,假设有4个气球,分值为3, 2, 4, 6,如图:

图片

在计算最高分的时候,还需要考虑气球是否处于最左边和最右边,代码比较繁琐。

可以考虑在左右两边增加两个虚拟气球,其分值为1,如图:

图片

如此一来,所有的黄色气球都处于中间位置,再也不需要考虑边界问题了。

当然,这也让我们进一步明确了dp[i][j]的含义,它表示的是扎破i到j之间所有气球的最高得分。

对于上面的4个气球来说,最后的结果是dp[0][5],表示从0~5之间所有的气球,不包括0和5本身,因为这两个气球是虚拟的,根本不存在。

可以绘制表格如下:

图片

最右上角的单元格dp[0][5]就是最终要计算的结果,实际上,所谓的动态规划,其实就是一个填表的过程。

2. 初始状态

所谓初始状态就是最简单的情况,对于戳气球问题而言,最简单的情况就是没有气球,此时得分为0。

对应到dp[i][j]数组,就是当j - i <= 1,即i和j两者之间没有气球可扎了,当然也就没有分数了。

对应的dp表格如下:

图片

这里将处在对角线偏右上的单元格设置为0,即:

dp[0][1] = dp[1][2] = dp[2][3] = dp[3][4] = dp[4][5]= 0

对于dp表格,我们要计算的是右上方的单元格,左下方的单元格可以忽略不计。

3. 状态转移方程

对于动态规划问题,状态转移方程是重点,也是难点,这里的状态转移方程又该如何确定呢?

还是以上面的数据为例,我们只需要分析最后戳破哪个气球的过程,4只气球可以分四种情况来考虑。

1). 最后戳第一只气球

最后戳破的气球分值为3,如图所示:

图片

这相当于把dp[0][5]拆分成两个子区间,分别是dp[0][1]和dp[1][5],戳破当前气球的得分为1 * 3 * 1,所以:

dp[0][5]= dp[0][1] + dp[1][5] + 3

2). 最后戳第二只气球

最后戳破的气球分值为2,如图所示:

图片

这相当于把dp[0][5]拆分成两个子区间,分别是dp[0][2]和dp[2][5],戳破当前气球的得分为1 * 2 * 1,所以:

dp[0][5]= dp[0][2] + dp[2][5] + 2

3). 最后戳第三只气球

最后戳破的气球分值为4,如图所示:

图片

这相当于把dp[0][5]拆分成两个子区间,分别是dp[0][3]和dp[3][5],戳破当前气球的得分为1 * 4 * 1,所以:

dp[0][5]= dp[0][3] + dp[3][5] + 4

4). 最后戳第四只气球

最后戳破的气球分值为6,如图所示:

图片

这相当于把dp[0][5]拆分成两个子区间,分别是dp[0][4]和dp[4][5],戳破当前气球的得分为1 * 6 * 1,所以:

dp[0][5]= dp[0][4] + dp[4][5] + 6

到底哪一种情况得分最高呢,其实就是取最大值的问题了。

你看到这其中的规律了吗?

实际上就是在i和j之间找分割点k,将dp[i][j]拆分成两个子区间dp[i][k]和dp[k][j],如图所示:

图片

对于每个分割点来说,左边区间的最大分值是dp[i][k],右边区间的最大分值是dp[k][j],加上本次戳破气球的分数p[i] * p[k] * p[j],这里的列表p保存的是每个气球的分值,包括左右两端的虚拟气球。

因此,状态转移方程如下:

dp[i][j] = max(  dp[i][j],   dp[i][k] + dp[k][j] + p[i] * p[j] * p[k])

这意味着,我们需要使用循环枚举i到j之间的每个分割点k,计算其最大分值,然后将最大值作为dp[i][j]的结果。

4. 遍历顺序

对于二维列表dp[i][j]来说,常见的遍历顺序是从上到下,从左到右。但是对于区间DP来说,不能采取这种遍历顺序。

我们还是看图说话吧,以计算dp[2][5]为例,它的分割点k有两个。

当k = 3时,计算如下:

dp[2][5] = dp[2][3] + dp[3][5] + p[2]* p[3] * p[5]

对应的DP表格如图:

图片

当k= 4时,计算如下:

dp[2][5] = dp[2][4] + dp[4][5] + p[2]* p[4] * p[5]

对应的DP表格如图:

图片

相信你已经发现了,在计算dp[2][5]的时候,它可以通过dp[2][3] + dp[3][5]计算出来,也可以通过dp[2][4] + dp[4][5]计算出来。

很显然,dp[2][3]、dp[3][5]、dp[2][4]、dp[4][5]这些单元格都在dp[2][5]的左方和下方,这就意味着不能使用传统的从上到下、从左到右。

针对这种情况,我们可以有两种遍历方式,一是斜线遍历,如图:

图片

二是从下到上,从左到右,如图:

图片

相对来说,使用第二种遍历方式更为简单一些。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们编写程序如下:

图片

代码不多,说明4点:

1). pts表示输入的气球分值,左右各增加了一个分值为1的气球,这里直接使用列表相加的运算,非常方便;

2). 二维dp列表行和列都是n + 2,初始值为0,这里使用了列表推导式;

3). i表示行,从下到上,初始值是n -1,终点是0,j表示列,自左至右,初始值是i  + 1,终点是n + 1;

4). k表示分割点,起始值是k+1,终点是j - 1。

至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。

四.总结与思考

本题代码在10行左右,涉及到的知识点包括:

  • 循环语句,尤其是嵌套循环;

  • 列表的操作;

  • 动态规划算法;

作为本次测评的最后一题,代码虽然不多,但是难度较大。关键点有两个,一是理解区间DP的算法思想,二是彻底弄清填充DP表格的方法和过程。

估计你已经发现了,最终的代码并不多,难的是过程分析,动态规划说难也难,说简单也简单。

动态规划说白了,就是根据题目意思定义一个表格,可能是一维的,也可能是二维的,然后找到规律,也就是状态转移方程,不断地计算并填充每一个单元格。

因此,在学习动态规划算法的时候,一定要亲自动手绘制并填充表格,这个过程会有些繁琐,但是效果非常好,写代码反倒是最简单的事情了。

超平老师给你留两道思考题:

1). 如何使用递归算法,计算最大分值?

2). 如果使用斜线遍历的顺序,代码又该怎么写呢?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

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

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

相关文章

图片怎样在线改像素大小?电脑快速修改图片大小的方法

在设计图片的时候下载的图片尺寸一般会比较大&#xff0c;在网上使用经常会因为尺寸的问题导致无法正常上传&#xff0c;那么如何快速在线改图片大小呢&#xff1f;想要修改图片尺寸可以在直接选择网上的图片改大小工具的功能来快速完成修改&#xff0c;操作简单方便使用&#…

FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…

0.25W 1.5KVDC~3KVDC 隔离超小型单输出 DC/DC 电源模块——TKE-W25系列

TKE-W25系列隔离超小型单输出 DC/DC 电源模块是一款超小型单输出电源模块&#xff0c;工业级环境温度&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波,用于需要电压转换和隔离的场合&#xff0c;封装有SIP和DIP可选。

MiniPCIe/SATA双用插槽无法识别minipcie模块怎么回事!

在计算机和嵌入式系统设计中,MiniPCIe/SATA双用插槽作为一种高度集成的解决方案,提供了极大的灵活性与扩展能力。它不仅能够支持MiniPCIe接口的无线网卡、固态硬盘控制器等模块,还能适应SATA接口的硬盘或固态存储设备,大大丰富了系统配置的可能性。尽管设计初衷良好,但在实…

Java—二分查找

介绍 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。其基本思想是将目标值与数组中间的元素进行比较&#xff1a; 如果目标值等于中间元素&#xff0c;则查找成功。如果目标值小于中间元素&#xff0c;则在数组左半部分继续进行二…

汽车悬架分为哪几类

汽车悬架分为哪几类 1)汽车的悬架系统可根据结构分为两种:独立悬架和非独立悬架,独立悬架根据构造又可以分为CDC运动悬架(CDC电磁悬架系统)和空气悬架; 2)当前比较火热的空气悬架,是独立悬架的一种; 3)前轮主要使用麦弗逊式独立悬架 和 双叉臂悬架,后轮主要使用多…

基于 DCT 的图像滤波

需求分析 对于图像去噪这一需求&#xff0c;我们可以通过DCT&#xff08;离散余弦变换&#xff09;算法来实现。DCT是一种基于频域的变换技术&#xff0c;可以将图像从空间域转换为频域&#xff0c;然后通过滤波等处理方式进行去噪。 针对这一需求&#xff0c;我们需要进行以下…

香港优才计划申请时间要多久?各流程申请周期规划,再晚就来不及了!

香港优才计划申请时间要多久&#xff1f;各流程申请周期规划&#xff0c;再晚就来不及了&#xff01; 2024年是香港优才计划不限配额的最后一年&#xff0c;明年政策如何变化还未可知&#xff0c;但如果明年又设置限额了&#xff0c;那么今年最后的机会一定要抓住了。 在这里…

美业SaaS收银系统源码-美团/口碑核销时报错:该商品未在美团/口碑上架怎么办?

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 可能是门店未做映射 • 美团门店映射&#xff1a;需要在【PC运营后端】-【渠道商品】-【美团点评门店管理】&…

elementUI type=“selection“多选框选中 删除 回显 赋值问题 回显数组改变选中状态未改变

业务需求&#xff1a; 点击查询弹列表框 勾选列表选项保存 可删除可重新查询列表添加 遇到的问题&#xff1a;删除之后查询列表selection回显问题 解决&#xff1a;row-click配合:reserve-selection"true"使用 <el-tableref"refPlanTable":data"…

AI时代的服装设计师--AIGC

AI时代的服装设计师--AIGC AIGCAIGC设计能替代真正的设计师吗森马T恤设计AIGC优势、优化 本文记录于去年参加的一次森马T恤设计活动的感受。 AIGC 可以说&#xff0c;近期以来&#xff0c;随着ChatGPT的不断发展&#xff0c;从ChatGPT-3到ChatGPT-4的飞速发展&#xff0c;AIGC…

【Spring Cloud】分布式配置

目录 未来的开发场景为什么需要配置中心配置实时生效配置管理流程 开源配置中心基本介绍DisconfSpring Cloud ConfigApolloNacos Spring Cloud Config介绍配置管理工具体系 案例需求编写 Config Server1.创建配置文件2.创建项目3.添加依赖4.添加注解5.修改配置文件application.…

selenium web 网页测试自动化需要哪些技术?

引言&#xff1a; 在当今互联网时代&#xff0c;网页测试自动化成为了确保软件质量和提高效率的重要手段之一。Selenium是一种功能强大且广泛应用的工具&#xff0c;可用于实现网页测试自动化。本文将带您了解Selenium Web网页测试自动化所需的技术和步骤&#xff0c;以便您从零…

伦敦银和现货白银是一回事吗

伦敦银和现货白银不能直接完全地画上等号&#xff0c;但如果投资者所指指的是国际市场上的现货白银交易&#xff0c;那么二者应该是等同的——因为在国际贵金属投资市场上&#xff0c;现货白银的别称就是伦敦银&#xff0c;伦敦银和现货白银指的其实是同一回事。 因为早在很多个…

MySQL学习——连接服务器和输入查询

MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;后来被Oracle公司收购。它使用SQL&#xff08;结构化查询语言&#xff09;作为访问和操作数据库的标准语言。 要查看 mysql 客户端程序提供的选项列表&a…

firebase如何自定义上传日志

我们可以很轻松的得到2个代码&#xff1a; Firebase.crashlytics.log(str) Firebase.crashlytics.recordException(ex)这就是firebase提供的自定义日志和excption上传的方法。 但是如果你认为log函数调用后&#xff0c;直接就能查看到日志就错了。 我们在这个page是找不到日志…

Ableton Live 11 Suite for Mac:音乐创作的全能伙伴

在数字音乐创作的广阔天地中&#xff0c;Ableton Live 11 Suite for Mac无疑是一颗璀璨的明星。作为一款专业的音乐制作软件&#xff0c;它集合了音频录制、编辑、混音、母带制作等全方位功能&#xff0c;为Mac用户提供了无与伦比的音乐创作体验。 Ableton Live 11 Suite拥有直…

隆道出席河南ClO社区十周年庆典,助推采购和供应链数字化发展

5月26日&#xff0c;“河南ClO社区十周年庆典”活动在郑州举办&#xff0c;北京隆道网络科技有限公司总裁助理姚锐出席本次活动&#xff0c;并发表主题演讲《数字化采购与供应链&#xff1a;隆道的探索与实践》&#xff0c;分享隆道公司在采购和供应链数字化转型方面的研究成果…

【赠书第25期】C#项目开发实战(微视频版)

文章目录 前言 1 项目构思与需求分析 1.1 项目构思 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…