【动态规划】C++算法312 戳气球

作者推荐

【动态规划】【字符串】扰乱字符串

本文涉及的基础知识点

动态规划

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,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
参数范围

n == nums.length
1 <= n <= 300
0 <= nums[i] <= 100

动态规划

nums前后各加一个1,设增加两个1后,nums的长度为m_c。则问题转化为nums[0,m_c-1] ,消除掉nums(0,m_c-1),不消除nums[0]和nums[m_c-1]的最大得分。我们用函数f(0,m_c-1)表示。我们枚举最后消除的元素k,则f(i,j)=f(i,k)+nums[i]*nums[k]*nums[j]+f(k,j)。
k的取值范围(i,j)

共有mn种状态,故空间复杂度是O(nm),每种状态的转移时间复杂度是O(1),故时间复杂度是O(nm)。m和n是t和s的长度。

动态规划的状态表示dp[i][j]等于f(i,j)
动态规划的转移方程f(i,j)=f(i,k)+nums[i]*nums[k]*nums[j]+f(k,j)
动态规划的初始状态全部0
动态规划的填表顺序len = j-i+1。len < 3 ,dp[i][j]=0,无需处理。第一层循环len从3到m_c,第二层循环i从小到大。由短到长处理子字符串,确保动态规划的无后效性
动态规划的返回值dp[0].back()

空间复杂度: 子数组的起点和终点,各n种可能。故空间复杂度:O(nn)。
时间复杂度: 状态nn种,每种状态的转移时间复杂度O(n),故总时间复杂度O(n3)。

代码

核心代码

class Solution {
public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.emplace_back(1);m_c = nums.size();vector<vector<int>> dp(m_c, vector<int>(m_c));for (int len = 3; len <= m_c; len++){int j;for (int i = 0; (j = i+len-1) < m_c; i++){			for (int k = i + 1; k < j; k++){dp[i][j] = max(dp[i][j], dp[i][k] + nums[i] * nums[k] * nums[j] + dp[k][j]);}}}return dp[0].back();}int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}int main()
{vector<int> nums;{Solution sln;nums = { 3, 1, 5, 8 };auto res = sln.maxCoins(nums);Assert(167, res);}{Solution sln;nums = { 1,5 };auto res = sln.maxCoins(nums);Assert(10, res);}}

2023年一月版

class Solution {
public:
int maxCoins(vector& nums) {
int iMax = 0;
m_c = nums.size();
vector<vector> dp;
dp.assign(m_c+1, vector(m_c));
for (int len = 1; len <= m_c; len++)
{
for (int c = 0; c + len - 1 < m_c; c++)
{
//计算dp[len][c]
//m是最后的气球,这样保证可以拆分两个子项
for (int m = c; m <= c + len - 1; m++)
{
int iSource = GetSource(nums, m,c-1,c+len);
if (m > c)
{
iSource += dp[m - c][c];
}
if (m < c + len - 1)
{
iSource += dp[c + len - 1 - m][m + 1];
}
dp[len][c] = max(dp[len][c], iSource);
}
}
}
return dp[m_c][0];
}
int GetSource(const vector& nums,int c,int iLeft,int iRight)
{
int iScource = nums[c];
if (iLeft >= 0)
{
iScource *= nums[iLeft];
}
if (iRight < m_c)
{
iScource *= nums[iRight];
}
return iScource;
}
int m_c;
};

2023年6月版

class Solution {
public:
int maxCoins(vector& nums) {
nums.insert(nums.begin(), 1);
nums.emplace_back(1);
m_c = nums.size();
//dp[len][iBegin]表示iBegin开始长度为len的区间,消除得剩余首尾2个元素获得的积分
vector<vector> dp(m_c + 1, vector(m_c, 0));
for (int len = 3; len <= m_c; len++)
{
for (int begin = 0; begin + len - 1 < m_c; begin++)
{
const int end = begin + len - 1;
for (int mid = begin + 1; mid < end; mid++)
{
const int leftLen = mid - begin + 1;
const int rightLen = len - leftLen + 1;
const int iNew = dp[leftLen][begin] + nums[begin] * nums[mid] * nums[end] + dp[rightLen][mid];
dp[len][begin] = max(dp[len][begin], iNew);
}
}
}
return dp.back()[0];
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

Simpy简介:python仿真模拟库-01/5

一、说明 在计算机编程领域&#xff0c;仿真在理解复杂系统、进行实验和做出明智决策方面发挥着关键作用。SimPy 是“Simulation Python”的缩写&#xff0c;是一个功能强大且多功能的仿真框架&#xff0c;允许开发人员和研究人员使用 Python 创建和分析离散事件仿真。无论您是…

视频如何制作微信表情?仅需一招在线制作

Gif动画表情包是当下一种非常流行的图片展示格式&#xff0c;能够通过gif格式的图片来调节聊天氛围或是传递信息&#xff0c;非常有趣。而gif动图现在也被各行各业的商家用作宣传使用&#xff0c;很吸引大众的目光。 那么&#xff0c;这种非常吸引人的gif动图是怎么制作的呢&a…

Power BI - 5分钟学习修改数据类型

每天5分钟&#xff0c;今天介绍Power BI修改数据类型 Power BI加载数据时&#xff0c;会尝试将源列的数据类型转换为更高效的存储、计算和数据可视化的数据类型。 例如&#xff0c;如果从Excel导入的值的列没有小数值&#xff0c;Power BI Desktop会将整个数据列转换为整数数据…

Spanner on a modern columnar storage engine 中文翻译

文章目录 0. 摘要1. 存储引擎2. 存储引擎迁移的挑战2.1 可靠性、可用性和数据完整性2.2 性能和成本2.3 复杂性 3. 迁移可靠性的系统原则方法3.1 可靠性原则和自动化架构3.2 迁移方案和按周迁移3.3 客户 部署感知 调度3.4 管理可靠性、可用性和性能 4. 项目管理和驱动指标概括 0…

基于领域驱动设计的低代码平台的设计与实现

本文介绍了基于领域驱动设计&#xff08;DDD&#xff09;的低代码平台的设计与实现方法。低代码平台是一种能够通过图形化界面和少量编码&#xff0c;快速构建应用程序的工具。通过结合DDD的思想&#xff0c;我们可以将领域专家的知识转化为具体的领域模型&#xff0c;并将其作…

网络层协议及IP编址

0x00 前言 本节为网络层协议及IP编址内容 IP地址的范围&#xff1a;0.0.0.0-255.255.255.255 IP分为网络位以及主机位。子网划分就是向主机位借位。 网络层协议 IPICMP&#xff08;internet Control message protocol&#xff09;IPX IP协议的作用 为网络层的设备提供逻…

手把手教你新建一个winform项目(史上最全)

文章目录 前言&#xff1a;第1步、打开Microsoft Visual Studio&#xff08;简称vs&#xff09;&#xff0c;本人这里使用的是Visual Studio 2017 专业版&#xff0c;如下图&#xff1a;1.2 Visual Studio Community 2019下载1.3 Visual Studio Community 2019 安装 第2步、点击…

2024年【A特种设备相关管理(锅炉压力容器压力管道)】报名考试及A特种设备相关管理(锅炉压力容器压力管道)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;报名考试是安全生产模拟考试一点通总题库中生成的一套A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;模拟考试题库&#xff0c;安全…

nodejs版本管理工具nvm的安装与使用

提示&#xff1a;nodejs版本管理工具nvm的安装与使用 文章目录 前言一、安装二、淘宝镜像配置三、安装所需版本的nodejs四、切换nodejs版本五、参考文档总结 前言 需求&#xff1a;新建一个vue3项目&#xff0c;&#xff0c;提示写法错误 查原因为node版本过低 随着技术更新迭…

Python Asyncio网络编程方法全面解析与实战应用!

更多Python学习内容&#xff1a;ipengtao.com Python的asyncio库是一种强大的异步编程工具&#xff0c;它使得编写高效的网络应用程序变得更加容易。在本文中&#xff0c;我们将深入探讨使用asyncio进行网络编程的方法&#xff0c;包括异步IO、协程、事件循环等方面的内容&…

Python编程+copilot+代码补全+提高效率

Python编程copilot代码补全提高效率 copilot是由Github和OpenAI合作开发的一款AI编程工具&#xff0c;它可以根据自然语言或部分代码&#xff0c;自动给出合适的代码补全建议。copilot支持多种编程语言&#xff0c;包括Python&#xff0c;也可以在Pycharm等主流IDE中使用。本资…

SpringIOC之support模块FileSystemXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

LINE网页版使用方法(内含LINE网页版特点总结)

如果想要在电脑上使用LINE&#xff0c;但是又觉得下载客户端很累赘的话&#xff0c;LINE网页版是你最好的选择。但是LINE网页版相对于其他平台来说使用方式比较少。所以今天就来讲讲&#xff0c;我们有什么方式可以在电脑中使用LINE。 LINE网页版使用方法 1.需要使用Chrome浏览…

【hyperledger-fabric】部署Java应用远程访问智能合约

简介 首先是根据b站的视频 hyperledger-fabric【3】在 java 应用中访问合约 以及hyperledger-fabric【5】Java应用和私有数据&#xff0c;本文章主要讲述的是视频中我遇到的问题&#xff0c;以及相关知识点的总结。 遇到的问题 问题1&#xff1a;git clone下载下来的代码发现…

《异侠传S1赛季侠义九州》公测版本三端互通PC客户端与IOS下载地址!!!

尊敬的各位异侠玩家们&#xff1a; 我们怀着无比激动的心情&#xff0c;充满感激地向大家宣布&#xff1a;今天上午10&#xff1a;00我们即将迎来《异侠传S1赛季&#xff1a;侠义九州》的首发公测&#xff01;在这个特殊的时刻&#xff0c;我们想将我们最诚挚的感谢献给每一位…

STM32 CubeMX LwIP + freertOS 移植

开发板: 官方 STM32F746 MCU型号&#xff1a;STM32F746NGH 网卡型号&#xff1a;LAN8742A 原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置&#xff0c;静态IP地址&#xff0c;关闭DHCP 生产代码&#xff…

Java版企业电子招投标系统源代码,支持二次开发,采用Spring cloud技术

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

iOS UITextField复制、粘贴框显示为英文如何解决

问题描述&#xff1a; 使用UITextField&#xff0c;欲粘贴文本&#xff0c;长按或者双击展示的提示框显示为英文 解决方案&#xff1a; 在Xcode配置文件info,plist文件中&#xff0c;新增Localizas属性&#xff0c;填入Chinese 结果如下&#xff1a; 提示框成功展示为中文

【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

文章目录 1. 备份 SD/TF 卡为镜像文件2. 压缩镜像文件2.1. 多分区镜像文件的压缩&#xff08;树莓派、普通 linux 系统等&#xff09;2.2. 单分区镜像文件的压缩&#xff08;Nvidia Jetson Nano 等&#xff09; 3. 还原镜像文件到 SD/TF 卡参考链接 1. 备份 SD/TF 卡为镜像文件…

运用Jmeter进行登录测试

开始了解Jmeter,写篇关于Jmeter的博客做备忘,这里以苏宁易购网站的登录请求为例实战来说明测试计划元件,创建一个 Web 测试计划。 今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。 a.下载jmeter软件 b.安装…