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

news/2024/11/24 3:11:16/

 

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://www.ppmy.cn/news/37926.html

相关文章

【动力节点】王鹤SpringBoot笔记——第五章 说说Web服务

目录 第五章 说说Web服务 5.1 高效构建Web应用 5.1.1 html页面视图 5.1.2 JSON视图 5.1.3 给项目加favicon 5.2 Spring MVC 5.2.1 控制器Controller 5.2.1.1 匹配请求路径到控制器方法 5.2.1.2 RequestMapping 5.2.1.3 控制器方法参数类型与可用返回值类型 5…

迅为3A5000_7A2000工控主板,龙芯自主指令集架构全国产工业级板卡性能

迅为iTOP-3A5000开发板核心板底板方式&#xff0c;底板资料开源&#xff0c;提供底板的原理图和PCB工程文件&#xff0c;可以根据需求定制属于自己的开发板。 核心板也支持工业级核心板定制开发。 根据二进制翻译功能使用&#xff0c;可流畅运行WIN和Android系统APP。 支持Loo…

Spring Boot集成Redis实现Key事件监听 | Spring Cloud 33

一、前言 在前面我们通过以下章节对Redis使用有了基础的了解&#xff1a; Spring Boot实现Redis同数据源动态切换DB | Spring Cloud 31 Spring Boot实现Redis多数据源动态切换 | Spring Cloud 32 此章节基于spring-boot-starter-data-redis模块&#xff0c;实现对Key事件监…

LeetCode222. 完全二叉树的节点个数(二分查找+二进制表示路径法)

一、题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的…

【vim进阶】vim编辑器的分屏操作(分屏显示文件,关闭分屏,分屏间光标的移动,移动分屏)

一、分屏显示文件 VIM 可以实现分屏操作&#xff0c;一个屏幕被多个文件给分占&#xff0c;有左右和上下两种分屏的方式。 方法一&#xff1a;启动分屏 左右分屏如下操作&#xff1a; vim -On file1 file2 ... filenn是数字&#xff0c;表示分屏的数量,n要大于等于文件个数…

设计模式---装饰模式

目录 介绍 实现 优缺点 装饰模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有类的一个包装。这种模式创建了一个装饰类&#xff0c;用来包装原有…

【新2023Q2押题JAVA】华为OD机试 - 找字符

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:找字符 题目 给定两个字符串…

目标检测算法——农业作物开源数据集汇总(收藏)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批农业作物开源数据集资源供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 一、农作物图像分类&#xff08;小麦、睡到、甘…