每日一解 戳气球(困难的动归)

2023-10-27

题目 戳气球

有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。
求所能获得硬币的最大数量。

说明:

  • 你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
  • 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

示例:
输入: [3,1,5,8]
输出: 167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins = 315 + 358 + 138 + 181 = 167

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/burst-balloons

思路

我自己想了半天动归的思路,但是都没有什么结果。看了看官解才意识到居然是一道时间复杂度O(n3)的题目,确实是一道很困难的题目。想要得到状态转移方程,就需要想到采用分治法降低问题难度。例如想到将戳破气球反过来,改为依次添加气球,其实不算难事,但是要运用分治法的思路来看待添加气球的过程。也就是得到如下的方程:

F(left, right) = nums[left] * nums[middle] * nums[right] + F(left, middle) + F(middle, right)

其中,left是左端点,right是右端点,middle为中间将要添加进去的那个气球。
也就是问题可以通过分治思路得到一个正确的求解方向:添加一个气球进去,求一下左中右三个气球的乘积,再递归去考虑中气球与左边气球构成的左右端点,再加入气球会是什么结果,和中气球与右气球中间再次加入气球会是什么结果。一直递归到左右两个端点气球是相邻的了,那么这个时候没右气球可以插入了,就有:

F(left, right) = 0 (left >= right - 1)

这个时候大体方向的思路是有了,但是很明显时间复杂度不止O(n3),因为还没有采用动态规划的空间换时间,存储会被重复计算到的内容。这个时候就需要分析一下会被重复计算到的值是什么。
拿题目中举的例子,输入为[3,1,5,8]来进行计算:

序号 0 1 2 3 4 5
1 3 1 5 8 1
备注 左端点 右端点

这里参考了一下官解的思路,设置了值为1的左端点和右端点,方便再插入第一个元素的时候进行计算。按照我们之前反向回推,”插入“气球的思路来看,最初的序列是这样:

序号 0 5
1 1
备注 左端点 右端点

现在要处理的问题是从1——4的数字中选一个插入,那么依次来看一下情况:

序号 0 1 5
1 3 1
备注 左端点 右端点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日一解 戳气球(困难的动归) 的相关文章

  • python-图形用户界面

    图形用户界面 1 python中图形界面库 界面开发 Tkinter 是 Python 官方提供的图形用户界面开发库 用于封装 TGUI 工具包 跨平台 PyQt 是非 Python 官方提供的图用户界面开发库 用于封装 Qt 工具包 跨平
  • 解决Xilinx Vitis 2020.1版本启动之后进入主页面无响应的结果

    一 问题描述 在启动 Xilinx Vitis 2021 1 时 无论是从 Xilinx Vivado 界面的 Launch Vitis 启动还是直接启动都会在启动后显示出主界面后未响应 其原因是 Windows 系统的 PATH 环境变量

随机推荐

  • dataframe iloc_pandas

    点击上方蓝字 关注并星标 和我一起学技术 今天是pandas数据处理专题第三篇文章 我们来聊聊DataFrame中的索引 上篇文章当中我们简单介绍了一下DataFrame这个数据结构的一些常见的用法 从整体上大概了解了一下这个数据结构 今天
  • 解决报错:java: You aren‘t using a compiler supported by lombok, so lombok will not work and has been dis

    解决idea 的因为lombok的报错 java You aren t using a compiler supported by lombok so lombok will not work and has been disabled Y
  • 【代码笔记】Transformer代码详细解读

    Transformer代码详细解读 文章目录 Transformer代码详细解读 简介 1 数据准备 1 1 词表构建 1 2 数据构建 2 模型整体架构 2 1 超参数设置 2 2 整体架构 2 2 模型训练 3 编码器 Encoder
  • source: no such file or directory: .bash_profile

    今天想看maven版本结果一直报未分配maven环境 因为用了idea后一直没顾上观察maven 直接打开vim bash profile 发现环境已经搭好了 没办法重新 source bash profile生效这个文件 结果报 经过网上
  • 启动Nessus服务后,登录https://localhost:8834时,提示无法访问网页

    安装Nessus后 登录https localhost 8834时提示网页无法访问 去到安装目录下的以系统管理员运行Nessusd exe时弹出提示nessusd exe启动失败 无法找到入口 无法作用于动态链接库C windows sys
  • system/WIFEXITED/WEXITSTATUS函数-linux

    system 感性认识 systerm两层含义 1 正确退出后 还需要再判断 操作成功或者操作失败 2 错误退出 include
  • TOMCAT配置:参数大小maxPostSize,参数个数maxParameterCount

    在更新了JSON校验器后 理论上不再存在问题 但是在使用JSON传递表单数据进行保存时依然出现了保存异常的情况 前台数据为7200个JSONObject组成的JSONArray 大小约为1 83M 其他参数若干 在参数传递到后台时发现后台并
  • 最新的Vivado安装、使用教程(2022/12/31)

    本文主要参考了黑金社区提供的资料 整理而成 目录 1 Vivado 开发环境 1 1 Vivado 软件介绍 1 2 Vivado 软件版本 2017 4比较稳定 2 Vivado 软件 Windows 下安装 3 重新安装驱动 4 大功告
  • 中位数(C语言)

    Description 计算有限个数的数据的中位数的方法是 把所有的同类数据按照大小的顺序排列 如果数据的个数是奇数 则中间那个数据就是这群数据的中位数 如果数据的个数是偶数 则中间那2个数据的算术平均值就是这群数据的中位数 现在给出n个正
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf

    面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 Go 基础类 GO 语言当中 NEW 和 MAKE 有什么区别吗 PRINTF SPRINTF FPRINTF 都是格式化输出 有什么不同 GO 语言当中数
  • xss-level1

    首先搭建xss靶场 打开浏览器输入地址来到第一关 这里我先查看了一下源代码 先试一下弹出会话框 name lt
  • 程序跑飞的如何查问题

    在下这厢有礼了 最近一直在调试公司的代码 调的我有点慢 给自己总结一下 我是在FPGA上调试 一个通信交互的工程 我遇到程序跑飞的无非是三种情况 1 数组越界 就是数组的大小只有array 100 但是那你用了array 500 产生越界
  • rk3368 开机内核启动不了

    Platform RK3368 OS Android 6 0 Kernel 3 10 0 电源管理芯片用的是配套的rk818 经测量发现板子在上电启动时 u boot阶段与kernel阶段dcdc电压不一样 从uboot切换到kernel时
  • 矩阵特征值与行列式、迹的关系

    矩阵的特征值之和等于矩阵的行列式 矩阵的特征值之积等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思考 x 2 bx c 0 这个方程的所有根的和等于多少 所有根的积等于多少 2 把二次方程推广到 N 次
  • Linux下安装opencv with-ffmpeg解决无法读取视频的问题

    Linux下安装opencv with ffmpeg解决无法读取视频的问题 参考文章 1 Linux下安装opencv with ffmpeg解决无法读取视频的问题 2 https www cnblogs com haiyang21 p 1
  • 求最大公约数,最小公倍数(c++)

    文章目录 最大公约数 质数和合数 公约数 计算最大公约数 辗转相除法 最小公倍数 最大公约数 质数和合数 质数也称素数 指大于1 并且除了1和它自己 不能被任何其他自然数整除的数 除了1和质数的其他自然数称为合数 合数必定可以分解成2个或以
  • Spring Cloud中的服务注册和发现是怎样实现的?Spring Boot和Spring Cloud的关系是怎样的?Spring的核心容器包括哪些模块?Spring的Bean作用域有哪些?它们的区

    1 Spring Cloud中的服务注册和发现是怎样实现的 在Spring Cloud中 服务注册和发现是通过Eureka来实现的 Eureka是Netflix开源的一个服务治理组件 用于实现服务注册和发现的功能 具体来说 服务的提供方会在
  • vue3使用jodit富文本编辑器,自定义各项配置及组件封装

    目录 常用配置 设置中文 字体设置 CDN的引用 图片上传 对编辑器中生成的元素添加默认属性 组件封装 本文使用时的版本 vue 3 2 36 jodit 3 24 7 Jodit 是国外编写的一个功能强大的富文本编辑器 有常规版本和PRO
  • “数据库事务(Database Transaction)

    事务的使用 关于事务 我今天要把自己放在一个初学者的心态来写这篇文章 之前几篇文章大多讲的是对于Winner的应用 今天要从根本上来讲 一下 事务 以及事务在Winner中的应用 首先从基础讲起 什么是 事务 事务能帮我们解决哪些问题 摘录
  • 每日一解 戳气球(困难的动归)

    题目 戳气球 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 如果你戳破气球 i 就可以获得 nums left nums i nums right 个硬币 这里的