【动态规划】LeetCode 312. 戳气球 --区间DP问题

article/2025/9/10 15:47:23

 

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

题目:戳气球

题解:

代码实现:

完结撒花

因为一些事,最近状态不是很好,加上今天的每日一题有点难,看的烦躁(就是菜 ,就来更新一下今天与每日一题相关的区间Dp问题(戳气球),这篇也是关于区间Dp的问题 uu可以看看 

话不多说,开始! 

题目:戳气球

题解:

这道题虽然被标为了Hard但依据Dp的特点,知道其中缘由之后也没有很难了.先来看看问题

有这样几个气球.我们要求出戳出他之后他掉落的最大金币数

例如,在戳掉1,则掉落的金币数为周围两个金币数相乘,再乘上被戳掉的气球的金币数

在思考dp问题的时候,我们需要将每一个子问题划分为不受周围影响的独立的子问题,所以观察我们刚刚的计算过程.我们发现,掉落的金币数与i j是有关系的

题目提到:如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

为了避免越界问题,那我们可以设定两个虚拟气球,他们得分都为1,这样可以将dp的子问题划分为

dp[i][j]的含义为:在i-1到j-1当中,戳破气球获得的最高分.

根据区间dp倒着推问题的特点:我们可以想想在i j当中,最后一个被戳爆的气球是哪一个.

其实每一个气球都能成为最后被戳破的那个,所以我们要做的就是在一定区间内去寻找,戳破这个气球,能获得最大收益的k值

若想要最后一个戳破k,则需要先将i-k的气球戳破,再将k-j的气球戳破,之后再将结果加上戳破k区间的值即可(注意k是最后一个戳爆的!!他的周围是没有球的,所以这就是为什么是独立的子问题的原因)

dp[i][j]=dp[i][k]+dp[k][j]+val[i]*val[j]*val[k]

观察发现,这是从小范围去推大范围,所以在计算大范围的时候,小范围一定是被准备好了.

所以从只有三个气球的区间开始计算,慢慢拓展到大的区间.存储每个区间可以获得的最大金币,留给之后计算

先看看Base Case是什么,当i j重合的时候,没有东西可以戳,此时得分为0

当我们计算任何一个Dp[i][j]的时候,我们希望dp[i][k] 与dp[k][j]都已经被计算出来了

所以我们一般采用,自底向上的遍历方法.

相关模板:

for(int i=n;i>=0;i--){for(int j=i+1;j<n;j++){for(int k=i+1;k<j;k++){..........}}}

也就是i从n开始到0结束,j从i+1开始小于n(这里的n是指不能取到额外给的那两个气球),而k介于这二者之间 ,为了避免越界问题,我们一般采用n+2的方法

代码实现:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:int maxCoins(vector<int>& nums) {vector<int>val(nums.size()+2);val[0]=val[val.size()-1]=1;for(int i=1;i<=nums.size();i++){val[i]=nums[i-1];}vector<vector<int>>dp(val.size(),vector<int>(val.size()));for(int i=val.size();i>=0;i--){for(int j=i+1;j<val.size();j++){for(int k=i+1;k<j;k++){dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+val[i]*val[j]*val[k]);}}}return dp[0][val.size()-1];}
};

完结撒花:

🌈本篇博客的内容【LeetCode 312. 戳气球 --区间DP问题】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!


http://chatgpt.dhexx.cn/article/MVd34sqr.shtml

相关文章

Golang每日一练(leetDay0105) 最小高度树、戳气球

目录 310. 最小高度树 Minimum Height Trees &#x1f31f;&#x1f31f; 312. 戳气球 Burst Balloons &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

Leetcode.312 戳气球

题目链接 Leetcode.312 戳气球 题目描述 有 n个气球&#xff0c;编号为0到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 n u m s [ i − 1 ] ∗ n u m s [ i ] ∗ …

LeetCode 312. 戳气球(Java)

题目 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…

每日一道算法题(3)--戳气球问题

题目 戳气球问题 :输入一个包含非负数整数的数组nums代表一排气球, nums[i]代表第i个气球的分数。现在, 你要戳破所有的气球,请计算出最高的分数。 分数的计算规则比较特别&#xff0c;当戳破第i个气球时, 可以获得nums[left] * nums[right] * nums[i]的分数&#xff0c;其中nu…

【leetcode】312.戳气球 (超详细解析,动态规划)

312. 戳气球 难度困难 有 n 个气球&#xff0c;编号为0 到 n-1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。如果你戳破气球 i &#xff0c;就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 lef…

戳气球问题

戳气球问题本质上可以认为是一种组合逆推的问题&#xff08;背包问题模型&#xff09; 我们可以有两种方法 1.dfs爆搜法 2.dp法 1.dfs爆搜法 dfs爆搜就是暴力枚举出哪个先破&#xff0c;哪个后破&#xff0c;直到找出最佳的方案 本质上是一个全排列问题&#xff0c;但是全…

Linux修改主机名—主机名和IP映射

一、修改主机名 /etc/sysconfig/network 二、主机名和IP映射 /etc/hosts Windows 里面的路径&#xff1a;C:\Windows\System32\drivers\etc

Linux系统下如何修改主机名

Linux系统安装好后&#xff0c;都会有默认的主机名&#xff0c;这里以CentOS系统为例&#xff0c;默认的主机名为localhost.localdomain&#xff0c;为了便于使用&#xff0c;我们常常需要修改主机名&#xff0c;下面演示的是永久更改主机名的方法。 方法/步骤 以根用户登录&a…

杂记 | Linux修改主机名(不用重启)

新买的云服务器主机名比较奇怪。强迫症难受&#xff0c;于是想通过Linux命令修改主机名&#xff0c;且选择最轻松的方案&#xff08;不想重启系统&#xff09;&#xff0c;使用以下命令即可&#xff1a; hostnamectl set-hostname 主机名 systemctl restart systemd-hostnamed…

修改Linux的主机名

修改主机名 新申请下来的设备&#xff0c;修改root后面的主机名为一连串的字符和数字用于centos7.X&#xff0c;其他版本未验证 修改主机名 hostnamectl set-hostname Test_Server1修改后可查看是否修改成功 cat /etc/hostname也可以通过修改hostname文件修改主机名未生效可…

Linux 永久修改主机名(转载)

Linux修改主机名&#xff0c;永久生效。 linux查看主机名: 查看主机命令&#xff1a; [rootlinux_epm2 ~]# hostname localhost.localdomain localhost.localdomain即为默认的主机名。 修改network文件: 用root用户登录&#xff0c;如果不是root用户&#xff0c;使用su命令切换…

Linux修改主机名(hostname)

查看当前的主机名 #第一种hostname #第二种hostnamectl修改主机名 执行修改命令&#xff1a; hostnamectl set-hostname <new-hostname>编辑hosts文件 vim /etc/hosts

Linux修改主机名(静态主机名、临时主机名)

背景 通常情况下Linux在安装时会设置主机名、root密码等相关参数&#xff0c;但安装后的使用过程中或许你需要修改主机名&#xff0c;本文讲述如何修改主机名&#xff0c;包括临时修改和永久修改。 查看主机名 原生态的Linux一般自带两个命令&#xff1a;hostname、hostname…

linux修改主机名命令

一、 使用hostname命令 比如我现在的主机名是haozhikuan-hbza&#xff0c;如果我想把主机名变成hbza-hbza可以用 hostname hbza-hbza 然后 hostname 或者uname -u都可以查看自己的主机名&#xff0c;如果再新打开一个终端就能看到自己的主机名已经修改过变成hbza-hbza了。 不…

Linux修改主机名永久生效

Linux&#xff08;centos7非此方法&#xff09; 修改主机名&#xff0c;永久生效。 linux查看主机名: 查看主机命令&#xff1a; [rootlinux_epm2 ~]# hostname localhost.localdomain localhost.localdomain即为默认的主机名。 修改network文件: 用root用户登录&#xf…

Linux修改主机名和域名

在/etc里有一个hostname这个是主机名存放文件&#xff0c;修改主机名就在这里面修改&#xff0c;用命令&#xff1a; vim /etc/hostname 进入后直接按下键盘上的D键&#xff0c;一下不行就两下&#xff0c;D键就将原有的主机名给删了&#xff08;D键可以一次性将光标所处的那一…

Linux修改主机名--立即生效的方法

Linux修改主机名–立即生效的方法 在使用Linux操作系统过程中&#xff0c;如果我们想更改主机名时&#xff0c;可以用以下命令进行操作 查看主机名 [rootecs-5332 ~]# hostname ecs-5332修改主机名&#xff0c;【myhost】可以替换为自己想要的主机名 [rootecs-5332 ~]# hos…

Linux永久修改主机名和IP

Linux永久修改主机名和IP 文章目录 Linux永久修改主机名和IP一、修改主机名1.查看当前主机名2.修改主机名的配置文件3.要想通过主机名访问&#xff0c;还需要修改一个配置文件4.然后执行reboot重启电脑5.再次执行hostname是否是你修改后的主机名 二、设置静态ip1.查看本机的配置…

Linux修改主机名的两种方法

Linux修改主机名的两种方法文章目录 先展示一下效果一、通过hostname命令直接更改主机名&#xff08;不是永久&#xff09;1、显示当前的主机名2、更改主机名 二、通过修改配置文件&#xff08;永久改&#xff09;1、hostname 和 hosts文件的作用2、修改配置文件中的主机名称 自…

修改Linux系统的主机名

1、查看当前的主机名 hostname 例&#xff1a; 2、修改主机名 (1)打开hostname文件 vim /etc/hostname (2) 按I键进入编辑模式&#xff0c;修改文件里的名字 例&#xff1a; (3)按Esc键&#xff0c;然后输入:&#xff0c;最后输入wq并按回车键退出 3、重新启动服务器 4…