【区间 DP】热门区间 DP 运用题
题目描述
这是 LeetCode 上的 「312. 戳气球」 ,难度为 「困难」。
Tag : 「区间 DP」、「动态规划」
有 n 个气球,编号为 0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。
如果 i - 1 或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。
求所能获得硬币的最大数量。
示例 1:
输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167
示例 2:
输入:nums = [1,5]
输出:10
提示:
区间 DP
定义 为考虑将 范围内(不包含 l 和 r 边界)的气球消耗掉,所能取得的最大价值。
根据题意,我们可以对 nums 进行扩充,将其从长度为 的 nums 变为长度 的 arr,其中 对应了原数组 nums,而 。
此时易知 即是答案,不失一般性考虑 该如何转移,假设在 范围内最后剩下的气球的编号为 ,此时的 由「以 为分割点的两端所产生的价值」和「消耗 本身带来的价值」两部分组成:
为了确保转移能够顺利进行,我们需要确保在计算 的时候,区间长度比其小的 和 均被计算。
因此我们可以采用先枚举区间长度 len,然后枚举区间左端点 l(同时直接算得区间右端点 r)的方式来做。
Java 代码:
class Solution {
public int maxCoins(int[] nums) {
int n = nums.length;
int[] arr = new int[n + 2];
arr[0] = arr[n + 1] = 1;
for (int i = 1; i <= n; i++) arr[i] = nums[i - 1];
int[][] f = new int[n + 2][n + 2];
for (int len = 3; len <= n + 2; len++) {
for (int l = 0; l + len - 1 <= n + 1; l++) {
int r = l + len - 1;
for (int k = l + 1; k <= r - 1; k++) {
f[l][r] = Math.max(f[l][r], f[l][k] + f[k][r] + arr[l] * arr[k] * arr[r]);
}
}
}
return f[0][n + 1];
}
}
TypeScript 代码:
function maxCoins(nums: number[]): number {
const n = nums.length
const arr = new Array<number>(n + 2).fill(1)
for (let i = 1; i <= n; i++) arr[i] = nums[i - 1]
const f = new Array<Array<number>>(n + 2)
for (let i = 0; i < n + 2; i++) f[i] = new Array<number>(n + 2).fill(0)
for (let len = 3; len <= n + 2; len++) {
for (let l = 0; l + len - 1 <= n + 1; l++) {
const r = l + len - 1
for (let k = l + 1; k <= r - 1; k++) {
f[l][r] = Math.max(f[l][r], f[l][k] + f[k][r] + arr[l] * arr[k] * arr[r])
}
}
}
return f[0][n + 1]
}
-
时间复杂度: -
空间复杂度:
最后
这是我们「刷穿 LeetCode」系列文章的第 No.312 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉
本文由 mdnice 多平台发布
相关文章:
【区间 DP】热门区间 DP 运用题
题目描述 这是 LeetCode 上的 「312. 戳气球」 ,难度为 「困难」。 Tag : 「区间 DP」、「动态规划」 有 n 个气球,编号为 0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i …...
正则表达式,日期选择器时间限制,报错原因
目录 一、正则表达式 1、表达式含义 2、书写表达式 二、时间限制 1、原始日期选择器改造 2、禁止选择未来时间 3、从...到...两个日期选择器的时间限制 三、Uncaught (in promise) Error报错 一、正则表达式 1、表达式含义 (1)/^([a-zA-Z0-9_.…...
YOLOv7 改进原创 HFAMPAN 结构,信息高阶特征对齐融合和注入,全局融合多级特征,将全局信息注入更高级别
💡本篇内容:YOLOv7 改进原创 HFAMPAN 结构,信息高阶特征对齐融合和注入,全局融合多级特征,将全局信息注入更高级别 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv7 专属 论文理…...
django建站过程(1)
django建站过程(1) 使用pycharm创建过程运行项目创建数据库创建超级用户登录生成的后台:界面本地化 准备以django,bootstrap来做一个过程记录,文章主要阐述过程的细节。 使用pycharm创建过程 创建项目“schoolapps”,…...
使用 Typhoeus 和 Ruby 编写的爬虫程序
以下是一个使用 Typhoeus 和 Ruby 编写的爬虫程序,用于爬取 ,同时使用了 jshk.com.cn/get_proxy 这段代码获取代理: #!/usr/bin/env rubyrequire typhoeus require jsondef get_proxyurl "https://www.duoip.cn/get_proxy"respon…...
Git 安装和基础命令、IDEA 基础操作
目录 总结命令:1、安装:1、安装2、配置环境变量: 2、Git操作:1、初始化:1、姓名邮箱:2、初始化仓库:3、工作区和暂存区分析 2、提交文件3、查看版本库状态4、安装小乌龟git不显示图标 5、查看提…...
做一个最新版的淘宝客返利程序源码有多难?
我们都知道淘宝客返利程序成为了很多人的创业和赚钱的工具。这种程序允许通过推广淘宝商品来获得佣金。然而,你知道构建这样一个淘宝客返利程序有多难吗?今天我们就从最基本的API说起,现在我将介绍构建一个最新版淘宝客返利程序所需的关键API…...
day5:Node.js 第三方库
day5:Node.js 第三方库 文章目录 day5:Node.js 第三方库使用 Express.js 构建 Web 应用安装 Express第一个 Express 框架实例第二个 Express 框架实例Node.js 连接 MySQL查询数据插入数据更新数据删除数据使用 Express.js 构建 Web 应用 Express框架是Node.js生态系统中的一…...
如何正确停止线程?为什么 volatile 标记位的停止方法是错误的?
Java全能学习面试指南:https://javaxiaobear.cn 今天我们主要学习如何正确停止一个线程?以及为什么用 volatile 标记位的停止方法是错误的? 首先,我们来复习如何启动一个线程,想要启动线程需要调用 Thread 类的 start…...
pytorch nn.Embedding 读取gensim训练好的词/字向量(有例子)
最近在跑深度学习模型,发现Embedding随机性太强导致模型结果有出入,因此考虑固定初始随机向量,既提前训练好词/字向量,不多说上代码!! 1、利用gensim训练字向量(词向量自行修改) #…...
2.1.1BFS中的Flood Fill和最短路模型
1.池塘计数 农夫约翰有一片 N ∗ M N∗M N∗M 的矩形土地。 最近,由于降雨的原因,部分土地被水淹没了。 现在用一个字符矩阵来表示他的土地。 每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,…...
Mysql 新增更新、删除新增、忽略
当主键或唯一键冲突时,Mysql可以进行更新、删除新增、忽略插入等操作。 1.更新 当主键或唯一键冲突时,可以指定更新内容。 INSERT INTO table_name (column_name, column_name, column_name) VALUES (column_value, column_value,column_value) ON DUPL…...
Node-模块系统的用法
题记 node.js模块系统的用法,以下是具体操作过程和代码 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。 一个 Node.js 文件就是一个模块,这…...
XSS攻击(1), 测试XSS漏洞, 获取cookie
XSS漏洞, 测试XSS漏洞, 获取cookie 一, 概念: XSS(Cross-Site Scripting), 跨站攻击脚本, XSS漏洞发生在前端, 依赖于浏览器的解析引擎, 让前端执行攻击代码. XSS其实也算注入类的攻击, XSS代码注入需要有JavaScript编程基础. 二, 目的: XSS(跨站脚本࿰…...
linux任务优先级
这篇笔记记录了linux任务(指线程而非进程)优先级相关的概念,以及用户态可以用来操作这些优先级的系统调用。 基本概念 调度策略 linux内核中的调度器为任务定义了调度策略,也叫调度类,每个任务同一时刻都有唯一的调…...
JVM内存模型概述
这里主要分为五大块,分别是:本地方法栈、方法区、java堆、程序计数器和java栈。其中重点是方法区、java堆和java栈。 下面就把各个区域的性质总结一下:(说明,下面的只是结论,没有详细的对各个内存块进行详细…...
【JavaEE】CAS -- 多线程篇(7)
CAS 1. 什么是 CAS2. CAS 伪代码3. CAS 是怎么实现的4. CAS的应用4.1 实现原子类4.2 实现自旋锁 5. CAS 的 ABA 问题 1. 什么是 CAS CAS: 全称Compare and swap,字面意思:”比较并交换“能够比较和交换 某个寄存器中的值和内存中的值, 看是否相等, 如果相等, 则把另…...
18-spring 事务
文章目录 1. xml和注解配置方式的对象2.spring事务传播特性3. 注解事务的初始化流程4. 创建事务信息流程图5. 事务回滚流程图 1. xml和注解配置方式的对象 2.spring事务传播特性 事务传播行为类型说明PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务…...
Qt窗体设计的布局
本文介绍Qt窗体的布局。 Qt窗体的布局分为手动布局和自动布局,手动布局即靠手工排布各控件的位置。而自动布局则是根据选择的布局类型自动按此类型排布各控件的位置,使用起来比较方便,本文主要介绍Qt的自动布局。 1.垂直布局 垂直布局就是…...
分布式锁 - 理论篇
一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”,如果占到,就执行逻辑。否则就必须等待,直到释放锁。“占坑”可以去redis,可以去数据库,可以去任何大家都能访…...
别再被弹窗烦了!Windows 10/11 UAC组策略保姆级调优指南(附注册表对照表)
彻底驯服UAC弹窗:Windows系统管理员的高效配置手册 每次安装软件时那个突然弹出的蓝色窗口,或是执行关键操作时打断思路的安全确认——UAC(用户帐户控制)确实是Windows系统安全的重要防线,但对于需要频繁进行系统操作的…...
别再让后台傻跑了!ASP.NET Core里CancellationToken的正确用法(含RestSharp实战)
高效终止后台任务:ASP.NET Core中CancellationToken的深度实践 当用户不耐烦地关闭浏览器时,你的服务器是否还在傻傻地执行那些已经无用的计算?想象一下这样的场景:用户上传了一张图片等待AI识别,却在处理过程中直接关…...
Windows系统配置自动化工具:WinUtil深度技术解析与实战指南
Windows系统配置自动化工具:WinUtil深度技术解析与实战指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 技术挑战与解决方案定…...
Docker 27存储卷动态扩容全链路拆解:从libcontainerd调用流程、runc exec-hooks触发机制,到btrfs quota自动生效原理
第一章:Docker 27存储卷动态扩容全景概览Docker 27(即 Docker v27.x 系列)首次原生支持存储卷(Volume)的在线动态扩容能力,无需停机、无需迁移数据,显著提升了容器化生产环境的弹性与可靠性。该…...
告别漂移轨迹!用Valhalla的HMM地图匹配API,5分钟搞定车辆轨迹纠偏
5分钟实战:用Valhalla的HMM算法实现高精度车辆轨迹纠偏 当物流调度系统显示某辆货车正在珠江中央"行驶",或是共享单车轨迹在建筑物间"穿墙而过",这些令人啼笑皆非的GPS漂移现象背后,是每个轨迹数据处理工程师…...
Notepad--跨平台文本编辑器实战:国产替代的高效解决方案
Notepad--跨平台文本编辑器实战:国产替代的高效解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- No…...
南洋理工大学MonoArt:单图生成可动3D模型,推理效率远超同行!
南洋理工大学提出MonoArt:单图生成可动3D模型南洋理工大学团队提出MonoArt,通过逐步推理实现从单图生成可动3D模型。该方法先恢复几何结构,再识别部件,最后推断运动方式与参数,无需外部数据或先验,就能构建…...
VisualCppRedist AIO:Windows运行库一站式终极解决方案
VisualCppRedist AIO:Windows运行库一站式终极解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为打开软件时遇到"缺少MSVCP140.dll…...
深入解析 .NET Core Kestrel 服务器:从基础配置到性能调优实战
1. 初识Kestrel:.NET Core的轻量级引擎 第一次接触Kestrel是在三年前的一个电商项目里,当时我们需要一个能在Linux容器中高效运行的Web服务器。IIS虽然强大但仅限于Windows环境,而Kestrel就像突然打开的新世界大门——这个由微软官方开发的跨…...
从零理解UDS 27服务:安全算法DLL背后的汽车网络安全逻辑与实战配置
从零理解UDS 27服务:安全算法DLL背后的汽车网络安全逻辑与实战配置 想象一下,当你用钥匙启动爱车时,发动机控制单元(ECU)会先验证钥匙芯片的加密信息——类似的"身份确认"机制,正是现代汽车网络安…...
