Leetcode #312:戳气球

【LeetCode】312. 戳气球 反向思考:将戳破气球转换为添加气球使用区间dp,dp[i][j]表示开区间(i,j)的最大值状态转移时考虑最后添加的气球位置k注意边界处理,在两端添加1。 阅读详情

Leetcode #312:戳气球

题目

题干

该问题戳气球 题面:

You are given n balloons, indexed from 0 to n - 1 . Each balloon is painted with a number on it represented by an array nums. You are asked to burst all the balloons.
If you burst the ith balloon, you will get nums[i - 1] * nums[i] * nums[i + 1] coins. If i - 1 or i + 1 goes out of bounds of the array, then treat it as if there is a balloon with a 1 painted on it.
Return the maximum coins you can collect by bursting the balloons wisely.

有 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 = 315 + 358 + 138 + 181 = 167

示例 2:
输入:nums = [1,5]
输出:10

题解

动态规划:

coins[i][j]表示的将下标(i,j)戳破可获得的最大值
coins[j][j+i] = max(coins[j][j+i], coins[j][k] + coins[k][j+i] + dpnums[j] * dpnums[k] * dpnums[j+i])

k是(i,j)里面最后戳破的气球下标

C++

class Solution {
public:
  int maxCoins(vector<int>& nums) {
    vector<int> dpnums(nums.size() + 2, 1);
    //将nums数组进行扩展[1,nums[0], nums[1], ... nums[n], 1]
    for(int i=0, j=1; i < nums.size(); i++, j++){
      dpnums[j] = nums[i];
    }
    vector<vector<int>> coins(dpnums.size(), vector<int>(dpnums.size(), 0));//coins[i][j]表示的将下标(i,j)戳破可获得的最大值
    int dpNumsSize = dpnums.size();
    for(int i = 2; i < dpNumsSize; i++) {
      for(int j = 0; j + i < dpNumsSize; j++) {
      //上面两层循环用于控制(j,i)的窗口的长度和移动
      //下面的循环用于穷举区间(i, j)中最后一个戳破的气球下标,从而确定窗口(i,j)戳破可得的最大值
        for(int k = j + 1; k < j + i; k++) {
          //coins[j][k] + coins[k][j+i]戳破(i,k)和(k,j)可获得的值
          //dpnums[j] * dpnums[k] * dpnums[j+i]戳破k可获得的值
          coins[j][j+i] = max(coins[j][j+i], coins[j][k] + coins[k][j+i] + dpnums[j] * dpnums[k] * dpnums[j+i]);
        }
      }
    }
    return coins[0][dpNumsSize - 1];
  }
};

Python

class Solution:
    def __init__(self, nums) -> None:
        self.nums = nums
        # 将nums两头各添加1
        self.nums.insert(0,1)
        self.nums.append(1)

    def maxCoins(self):
        nums_size = len(self.nums)
        coins = []
        for i in range(nums_size):
            coins = coins+[[0]*nums_size]
        for i in range(2, nums_size):
            for j in range(nums_size-i):
            #上面两层循环用于控制(j,i)的窗口的长度和移动
            #下面的循环用于穷举区间(i, j)中最后一个戳破的气球下标,从而确定窗口(i,j)戳破可得的最大值
                for k in range(j+1, j+i):
                #coins[j][k] + coins[k][j+i]戳破(i,k)和(k,j)可获得的值
                #dpnums[j] * dpnums[k] * dpnums[j+i]戳破k可获得的值
                    coins[j][j+i] = max(coins[j][j+i], coins[j][k] + coins[k][j+i] + self.nums[j] * self.nums[k] * self.nums[j+i])
        return coins[0][nums_size - 1]
312戳气球——力扣算法系列2020.07.19 Python 第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中。 现在要求你戳破所有的气球。如果你戳破气球i,就可以获得nums[left] * nums[i] * nums[right]个硬币。 这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球i后,气球left和气球right就变成了相邻的气球。 求所能获得硬币的最大数量。 说明: 你可以假设 nums[-1] = nums[n] = 1,但注意它们 阅读详情

相关推荐

视频帧插学习(三):ema-vfi代码拆解和分析

video interp EMA-VFI

mikhailbran的博客 710

leetcode 312. 戳气球

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

Qin_酱的博客 257

Claude Code 接入 DeepSeek-V4 教程

本文介绍Claude Code的安装配置流程:1) 安装Node.js 18+和Git(Windows);2) 通过npm全局安装@anthropic-ai/claude-code;3) 配置DeepSeek API环境变量(需替换API Key);4) 启动Claude Code或配置VSCode插件。重点包括Linux/macOS和Windows的环境变量设置方法,以及VSCode插件的settings.json配置项。完成配置后即可在终端或VSCode中使用Claude Code功能。

培根芝士的专栏 2011

LeetCode 312. 戳气球 (记忆化搜索 / 动态规划)

LeetCode链接 LeetCode 312 一、问题描述 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后...

qq_36183146的博客 502

树莓派4B没有serial0或ttyS0,serial0没有映射到ttyS0,serial0和serial1调换映射

环境: 树莓派4B,ubuntu mate20 现象 终端输入ls -l /dev,发现只有serial1->ttyAMA0,没有serial0页没有ttyS0,更没有二者的映射。网上很多方法都是树莓派3B和3B+的,我自己试过,不太适用于4B,下面的方法是4B的,我自己用是成功的。 解决方法 cd /boot/firmware sudo gedit config.txt 注意不是/boot下的config,而是/boot/firmware下的config 打开文件后,找到enable_uart=0

qq_41208487的博客 7891

UWB定位原理详细介绍

Hello大家好我是小智,今天我来给大家介绍下超宽带的定位原理,首先我们来讲下什么是UWB技术。 超宽带(Ultra Wide Band)简称UWB,和我们熟悉的WIFI、蓝牙技术一样属于通信技术的一种,UWB是一种无线载波通信技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,其所占的频谱范围很宽,右图是一种典型的正弦载波信号图。 UWB这种技术有什么特点呢? UWB系统结构实现简单;2.具有高速的数据传输能力;3.功耗低;4.安全性高;5.多径分辨能力强;6.可用于精确定位等特点。 UWB.

qq_35699674的博客 2万+

leetcode-312. 戳气球

每个气球上都标有一个数字,这些数字存在数组。超出了数组的边界,那么就当它是一个数字为。现在要求你戳破所有的气球。学习i,j,k各自for循环的范围。相邻的两个气球的序号。求所能获得硬币的最大数量。

曼巴的博客 567

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 117

DP-LeetCode312. 戳气球

1、题目描述 https://leetcode-cn.com/problems/burst-balloons/ 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组nums中。 现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得nums[left] * nums[i] * nums[right]个硬币。这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球 i 后,气球left和气球right就变成了相邻的气球。 ...

IOT_victor的博客 237

Android 14 (AOSP) 源码架构深度解析与开发者指南

Android14源码的仓库指南信息

保持专注,保持热爱 1186

手撕数美风控三板斧:device_fingerprint/device_id/hmac生成逻辑全解析

摘要:逆向分析数美风控核心参数生成机制 本文详细记录了逆向分析数美(Shumei)风控系统中三个关键参数(device_id、device_fingerprint、hmac)的生成逻辑。通过抓包分析和动态调试(使用Frida、IDA等工具)发现:device_id由设备IMEI和Android ID经MD5哈希生成;device_fingerprint融合23项设备与环境信息,并采用SHA-256哈希和动态环境检测;hmac则是参数+指纹+动态盐值的SHA-256签名。文章揭示了数美"设备指纹+动

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1469

leetcode 312 戳气球

leetcode 312 戳气球(区间动态规划)

好好学习,天天向上 177

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1235

312 戳气球(区间dp)

1. 问题描述: 有 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] 输出:1...

二哈 271

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode(312):戳气球 Burst Balloons(Java)

2019.7.23 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) 这道智力题一下子看起来让人无从下手,因为每个气球本身的分值取决于相邻气球的分值之和,而戳破后,气球之间的相邻状态会发生改变。那么对于不同的n个戳气球的选择,会生成n个不同的结果,实质反映会是一棵深度为n,结点的度从n开始逐层减少的决策树。 那么其实可以想到一种递归的做法,但是很明显,当n比较大的时候会超时...

NJU_ChopinXBP的博客 529

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法学习笔记——动态规划:戳气球

LeetCode312.戳气球数组nums中,保存了每个气球上的数字,戳破一个气球,得分是(若越界,认为两个边界上有数值为1的虚拟气球)可以按照不同顺序戳破气球,问所能得到的最高分数如nums=[3,1,5,8],返回167([3,1,5,8]-->[3,5,8]-->[3,8]-->[8]-->[])...

Insomnia_X的博客 709

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

刷题记录:312. 戳气球

312. 戳气球 class Solution: def maxCoins(self, nums: List[int]) -> int: nums_extra = [1] + nums + [1] size = len(nums_extra) dp = [[0] * size for _ in range(size)] for len_of_sec in range(2, size): # enumerate differen

Peloponnesian的博客 330

LeetCode312-戳硬币(动态规划)

LeetCode312-戳硬币 题目: 有 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,

SoulMartyr的博客 231

【Leetcode刷题】:Python:312. 戳气球

题目 312. 戳气球 代码:dp:O(n**3) class Solution: def maxCoins(self, nums: List[int]) -> int: nums = [1] + nums +[1] n = len(nums) dp = [[0 for i in range(n)] for j in range(n)] for size in range(3, n+1): # 窗口大小 f

Jack_Kuo的博客 528

LeetCode(力扣) 312题:戳气球----动态规划求解附带详细注释

问题描述 有n个气球,编号为 0 到 n-1,每个气球上都标有一个数字,这些数字存在于数组nums中。 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得nums[i-1] * nums[i] * nums[i+1]枚硬币。这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。 求所能获得硬币的最大数量。 示例 输入:nums = [3,1,5,8] 输出:167 解释: nums = [3,1,5,

Just_do_myself的博客 1466

LeetCode 312. 戳气球(Hard)

【题目链接】 题解 戳气球 动态规划关键思路解释 思路 代码 class Solution: ### 0108 动态规划(5436 ms,20.3 MB) def maxCoins(self, nums: List[int]) -> int: # 计算在一个区间上的最大值 def interval_score(i, j): score = 0 # k为开区间(i, j)之间最后戳的一个气球 .

newCraftsman的博客 192

动态规划:力扣312. 戳气球

1、题目描述: 2、题解: 动态规划: 1、状态定义; 2、状态转移方程; 3、初始化;base case 4、输出; 5、思考状态压缩。 可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。或者用DP table 由题意nums[-1] = nums[n] = 1,我们先把nums数组扩展,在其前后分别加上1,此时数组的长度比原数组的长度多2. 状态定义: dp[i][j],表示开区间(i,j)之间coin的数量 状态转移方程: dp[i][j] = max(dp[i][j],dp[i][

weixin_42042056的博客 314

LeetCode 热题 HOT 100 第七十二天 312. 戳气球 困难题 用python3求解

那你可能又想问了,戳爆粉色气球我能获得val[i]*val[k]*val[j]这么多金币我能理解(因为戳爆k的时候只剩下这三个气球了),所以你把(i,k)开区间所有气球戳爆,然后把戳爆这些气球的所有金币都收入囊中,金币数量记录在dp[i][k]你在(i,j)开区间得到的金币可以由dp[i][k]和dp[k][j]进行转移。同理,(k,j)开区间你也已经都戳爆了,钱也拿了,记录在dp[k][j]所以你把这些之前已经拿到的钱dp[i][k]+dp[k][j]收着,......

weixin_40634691的博客 402

【动态规划】leetcode312.戳气球

题目: 有 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[i][j]:填满开区间 (i,j)(i,j) 能得到的最多硬

jqq125的博客 441

[Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]

【问题描述】[困难] 【解答思路】 1. 记忆化搜索 时间复杂度:O(n^3) 空间复杂度:O(n^2) class Solution { public int[][] rec; public int[] val; public int maxCoins(int[] nums) { int n = nums.length; val = new int[n + 2]; for (int i = 1; i <= n

dadongwudi的博客 237

leetcode312. 戳气球

其中dp(i,j)表示在区间(i,j)上的最优值,w(i,j)表示在转移时需要额外付出的代价,min也可以是max。指在一段区间上进行动态规划,一般做法是由长度较小的区间往长度较大的区间进行递推,最终得到整个区间的答案。注意在做推导时可以画图看一下状态转移的方向,如何根据base case得到答案。并且注意目标值位置和需要推导的区间。

weixin_44392348的博客 121
上一篇: Leetcode #313: 超级丑数
下一篇: Gitlab权限
wq_0708
博客等级 码龄6年 2万+粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值