【动态规划】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会将整个数据列转换为整数数据…

信息学奥赛一本通1268:【例9.12】完全背包问题代码+详解

题目链接&#xff1a;1268 题目 1268&#xff1a;【例9.12】完全背包问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 40600 通过数: 21799 【题目描述】 设有n&#xfffd;种物品&#xff0c;每种物品有一个重量及一个价值。但每种物品的数量是无限的&…

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、协程、事件循环等方面的内容&…

华为认证 | HCIP和HCIE难度差多了?

许多有志于在ICT领域发展的人士&#xff0c;都希望获得华为的HCIP或HCIE认证。 那么&#xff0c;考取这些认证到底需要多少钱&#xff1f;HCIP和HCIE的难度又存在怎样的差异&#xff1f;下面将为您揭晓答案。 01 考华为HCIE多少钱&#xff1f; ★ 考试费用 华为HCIE认证考试的…

22. Mysql 触发器

文章目录 概念常见操作查看触发器创建触发器删除触发器 精选示例数据完整性约束数据同步日志记录 总结参考资料 概念 触发器&#xff08;Trigger&#xff09;是 Mysql 数据库中的一种特殊的存储过程&#xff0c;它会在数据库中的指定表上自动执行某些操作。当满足触发器定义的…

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

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

正则表达式速查手册

正则表达式 1、正则表达式简介2、常用正则表达式速查手册 1、正则表达式简介 正则表达式是一种强大的文本匹配工具&#xff0c;可以用于在文本中查找特定的模式 正则表达式由不同类型的字符组成&#xff0c;包括普通字符、元字符、分隔符和转义字符等。其中&#xff1a; 普通字…

超niu的正则

有一个几百行的建表语句&#xff0c;给到咱的时候各种乱&#xff0c;需要整理一下 a1 as num1 string comment , a2 as num2 string comment , ...... 在notpad里需要把上述sql修改成 num1 string comment , num2 string comment 搞了一会&#xff0c;用下面这个正则就可以…

服务器超线程的好处

服务器超线程的好处 1、提高性能&#xff1a;超线程通过提高整体系统吞吐量显着提高服务器性能。通过允许多个线程在单个物理内核上同时执行&#xff0c;超线程减少了空闲时间并最大限度地利用了可用资源。这会加快任务执行速度并缩短应用程序的响应时间&#xff0c;尤其是在多…

SpringIOC之support模块FileSystemXmlApplicationContext

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

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

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

数据的相似度计算

相似度系数又称为相关系数&#xff0c;常用于考察两个变量x、y之间的相关程度。 若为0&#xff0c;则x和y无相关性若为正&#xff0c;则x和y呈正相关&#xff0c;相关系数在0~1之间若为负&#xff0c;则x和y呈负相关&#xff0c;相关系数在-1~0之间相似度系数的绝对值越大&…