LeetCode HOT 100 —— 312.戳气球

news2024/9/24 17:20:52

题目

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。
这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1
超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。
在这里插入图片描述

思路

区间dp:
定义 f[i][j]为考虑将 (i,j)范围内(不包含 ij 边界)的气球消耗掉,所能取得的最大价值。

考虑在开区间内最后一个被戳破的气球k,即k是这个区间内最后一个被戳破的气球,换句话说,目前剩下的气球就是只剩下开区间的首尾ij,以及最后一个被戳破的气球k

假设 dp[i][j] 表示开区间 (i,j) 内能拿到的最多金币   那么这个情况下 ,在 (i,j) 开区间得到的金币可以由 dp[i][k]dp[k][j] 进行转移,如果此时选择戳爆k气球,那么得到的金币就是total = dp[i][k] + val[i] * val[k] * val[j] + dp[k][j],其中val[i] 表示 i 位置气球的数字

也正是因为 k 是最后一个被戳爆的,所以 (i,j) 区间中 k 两边的东西必然是先各自被戳爆了的, 左右两边互不干扰

最后在 (i,j) 区间中选取的k可以是多个,进行一个枚举,从中选择使得 total 值最大的即可用来更新 dp[i][j],然后从 (i,j) 开区间只有三个数字的时候开始计算,储存每个小区间可以得到金币的最大值 然后慢慢扩展到更大的区间,即j不断扩大,利用小区间里已经算好的数字来算更大的区间即可

java代码如下:

class Solution{
	public int maxCoins(int[] nums){
		int n = nums.length;
		//创建一个辅助数组,在首尾各添加1,方便处理边界问题
		int[] temp = new int[n + 2];
		temp[0] = 1;
		temp[n+1] = 1;
		//填充原数组的值
		for(int i = 0; i < n; i++){
			temp[i + 1] = nums[i];
		} 
		int[][] dp = new int[n + 2][n + 2];
		//len表示开区间长度,从(i,k,j)开始循环,逐渐扩大
		for(int len = 3; len <= n + 2; len++){
			for(int i = 0; i <= n + 2 - len; i++){
				int res = 0;
				//k为开区间(i,j)内的索引
				for(int k = i + 1; k < i + len - 1; k++){//范围不断扩大
					int left = dp[i][k];//表示区间(i,k)
					int right = dp[k][i + len -1];//表示区间(k,i + len - 1)
					res = Math.max(res,left + temp[i] * temp[k] * temp[i + len - 1] + right);
				}
				dp[i][i + len - 1] = res;//不断记录开区间的最大金币
			}
		}
		return dp[0][n+1];
	}
}

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

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

相关文章

别只关注chatGPT能不能写论文了,它还支持49中场景,代码都给你写好了,速领

简介 chatGPT最近非常不稳定&#xff0c;访问一不小心就出现了网络错误&#xff0c;根本就不能很好的使用。那么我们该怎么办呢&#xff1f;勇哥给大家想到了一个种办法&#xff0c;就是用程序去调用openapi的接口&#xff0c;这个接口虽然是收费的&#xff0c;但是可免费使用…

linux下源码编译cloudcompare(解决无法加载pcd文件的问题)

cloudcompare是一款点云处理软件&#xff0c;里面有很多算法&#xff0c;值得大家学习研究。 下面介绍linux下源码编译cloudcompare的方法。 1.安装依赖&#xff1a; sudo apt-get install doxygen sudo apt install cmake-curses-gui2.下载&#xff1a; git clone --recurs…

Qt之天气预报——界面优化篇(含源码+注释)

一、界面优化效果 下方为界面优化完成和优化前的效果对比。 优化前&#xff1a; 优化后&#xff1a; 二、优化内容 添加标题栏添加图片&#xff08;图图标素材源自阿里巴巴矢量图标库&#xff09;更新UI内容&#xff08;微调大小、布局比例&#xff09;添加鼠标事件函数&…

Java 教程

Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。 本教程通过简单的实例将让大家更好的了解 Java 编程语言。 移动操作系统 Android 大部分的代码采用…

RepVGG:一个结构重参数化网络

本文来自公众号“AI大道理” ResNet、DenseNet 等复杂的多分支网络可以增强模型的表征能力&#xff0c;使得训练效果更好。但是多分支的结构在推理的时候效率严重不足。 看起来二则不可兼得。 能否两全其美&#xff1f; RepVGG通过结构重参数化的方法&#xff0c;在训练的时候…

2022 年 Kubernetes 高危漏洞盘点

2022 年&#xff0c;Kubernetes继续巩固自己作为关键基础设施领域的地位。从小型到大型组织&#xff0c;它已成为广受欢迎的选择。出于显而易见的原因&#xff0c;这种转变使 Kubernetes 更容易受到攻击。但这还没有结束&#xff0c;开发人员通常将Kubernetes 部署与其他云原生…

【2022.12.18】备战春招Day13——每日一题 + 234. 回文链表 + 139. 单词拆分

【每日一题】1703. 得到连续 K 个 1 的最少相邻交换次数 题目描述 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动&#xff0c;你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包含 k 个 连续 1 的 最少 交换次数 输入&#xff1a;nums …

【数据结构】堆(二)——堆排序、TOP-K问题

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 堆排序&#xff1a;&#xff08;以小堆为例&#xff09; Heapsort函数…

C语言重点解剖关键字要点速记

1.在windows中&#xff0c;双击的本质是运行该程序&#xff0c;就是将程序(.exe)加载到内存当中去。任何程序在被运行之前都必须加载到内存当中去。 2.所有的变量本质都是在内存的某个位置开辟的。变量不能定义在硬盘上&#xff0c;因为变量必须在程序运行的时候才能被开辟&am…

SPRING-了解1

1)最终address: 查找路径比较长&#xff0c;很有趣 JFrog 原始步骤1)进入 spring.io&#xff0c;点击右上角黑色标记边的标记 2)进入 git,找到 Binaries下面的 Spring Framework Artifacts 3)进一步找到Downlaoding a Distribution,下面有 https://repo.spring.io 4)x选择…

牛客SQL每日一题之SQL136 每类试卷得分前3名

文章目录SQL136 每类试卷得分前3名描述示例1输入&#xff1a;输出&#xff1a;答案SQL136 每类试卷得分前3名 描述 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间&#xff09;&#x…

C# 中的 Infinity 和 NaN

C# 语言中&#xff0c;对于 int&#xff0c;long 和 decimal 类型的数&#xff0c;任何数除以 0 所得的结果是无穷大&#xff0c;不在 int&#xff0c;long 和 decimal 类型的范围之内&#xff0c;所以计算 6/0 之类的表达式会出错。 但是&#xff0c;double 和 float 类型实际…

Java入门笔记补充

Java基础笔记补充数据类型数据类型整形拓展浮点型拓展字符型拓展类型转换变量变量作用域局部变量实例变量静态变量变量的命名规范数组三种初始化静态初始化动态初始化数组的默认初始化Arrays类内存分析栈 stack&#xff1a;堆 heap&#xff1a;方法区(也是堆)&#xff1a;封装继…

卷积神经网络 图像处理,卷积神经网络图片处理

1、在做图像处理时&#xff0c;如何提高识别算法的设计与效果的精度&#xff1f; 得到更多的数据 这无疑是最简单的解决办法&#xff0c;深度学习模型的强大程度取决于你带来的数据。增加验证准确性的最简单方法之一是添加更多数据。如果您没有很多训练实例&#xff0c;这将特…

AllegroBGA如何自动fanout操作指导

AllegroBGA如何自动fanout操作指导 当我们需要给BGA做fanout的时候,逐个pin去fanout是件比较麻烦的事情,下面介绍Allegro中如何自动fanout,以下图BGA为例 具体操作如下 选择Route-Create Fanout 选择Via类型,比如Via10 Via Direction BGA Quadrant Style Pin-via Space…

数字化母婴店,母婴智慧会员管理小程序

会员店想必很多小伙伴都接触过或有所耳闻&#xff0c;会员店的本质是通过好产品、好服务及好内容营造出完整且完美的用户消费体验&#xff0c;虽然纯会员店并不多&#xff0c;但如今越来越多的各行业商家意识到每个流量用户都很重要&#xff0c;需要维护好每个用户&#xff0c;…

18.Django大型项目之用户中心页面

1. 用户中心的搭建 1.1 基础搭建 这里&#xff0c;主要就是基础的页面渲染&#xff0c;使用的也是继承主模板&#xff0c;对其进行修改的方式。就直接看代码吧 1.2 上下文的应用 什么是上下文&#xff1f; 对于上下文&#xff0c;可以理解成一个公用的函数或者类 我们这里使…

Qt使用MSVC2015找不到编译器的解决办法

Qt使用MSVC2015找不到编译器的解决办法 1、问题描述 安装qt前&#xff0c;已安装vscode&#xff0c;构建套件MSVC2015 32/64bit出现红色感叹号&#xff0c;并报错构建套件中未设置编译器 2、解决办法 step1:通过windows SDK工具安装调试器。 工具下载地址&#xff1a;https:/…

244. 谜一样的牛——二分+树状数组

有 n 头奶牛&#xff0c;已知它们的身高为 1∼n 且各不相同&#xff0c;但不知道每头奶牛的具体身高。 现在这 n 头奶牛站成一列&#xff0c;已知第 i 头牛前面有 Ai 头牛比它低&#xff0c;求每头奶牛的身高。 输入格式 第 1 行&#xff1a;输入整数 n。 第 2…n 行&#x…

Linux——组管理和权限管理

Linux组 基本介绍 在Linux中的每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;在Linux中每个文件有所有者&#xff0c;所在组&#xff0c;其他组的概念。 所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为该文件的所有者。 查…