689. 三个无重叠子数组的最大和(dp)

这道题使用动态规划

解法一:非常规的动态规划

这道题相当于选出3个长度为k的子数组,要求子数组和最大,返回的是每个子数组的第一个元素的下标。
首先,求所有长度为k的子数组的和,即sum,并将结果存储在对应首个元素索引下,例如,

输入:[1,2,1,2,6,7,5,1], 2
则:sum = {3,3,3,8,13,12,6}

如果nums数组长度为n,则sum数组长度为n-k+1
然后,思考找到3个长度为k的数组,并要求子数组和最大,在已经得到了sum的情况下,可以转化为求sum中3个原元素位置不重叠且3个sum元素值和最大。
这里假设选中sum[i],那么只需要求其左右两边最大的sum值,但是注意其下标要不和i重叠,即至少小于等于i-k和大于等于i+k

于是,设置两个数组leftrightleft[i]表示从0isum[i]最大值的下标right[i]表示从n-1isum[i]最大值的下标,注意这里的下标都是sum数组的下标而不是nums数组的。
于是3个选中的sum值的和就应该是
sum[left[i-k]] + sum[i] + sum[right[i+k]]

其中,以k = 2为例,sum[i]相当于nums[i], nums[i+1],而sum[left[i-k]]相当于nums[i-2], nums[i-1]sum[right[i+k]]相当于nums[i+2],nums[i+3],这样就保证了元素的不重叠。

另外,这里求sum数组的时候,并没有使用N*N复杂度的计算,而是采用了首先设定一个初始值然后依次相加相减得到,复杂度降低。

class Solution {
public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {vector<int> sum;int cnt = 0;for (int i = 0; i < k; ++i) {cnt += nums[i];}sum.push_back(cnt);for (int i = k; i < nums.size(); ++i) {cnt += nums[i] - nums[i - k];sum .push_back(cnt);}vector<int> ans(3);int n = sum.size();	// 注意是sum的长度vector<int> left(n, 0);vector<int> right(n, n - 1);for (int i = 1; i < n; ++i) {if(sum[i] > sum[left[i - 1]]) left[i] = i;else left[i] = left[i - 1];}for (int i = n - 2; i >= 0; --i) {if(sum[i] >= sum[right[i + 1]]) right[i] = i;else right[i] = right[i + 1];}int mx = 0;for (int i = k; i < n - k; ++i) {if (mx < sum[left[i - k]] + sum[i] + sum[right[i + k]]) {mx = sum[left[i - k]] + sum[i] + sum[right[i + k]];ans = {left[i - k], i, right[i + k]};}}return ans;}
};

解法二:倒序动态规划

首先思考正常的动态规划的思路:
i0开始遍历,分别计算f(i)的值,而f(i)表示以索引值为i的元素为结尾的区间,得出的结果是索引值i更大的区间
在这道题中,我们设置f[i][j]表示以第i个元素为结尾的区间中包含j个不重叠子数组的和,分两种情况讨论:

  1. 不包含Ai,则f[i][j] = f[i-1][j]
  2. 包含Ai,相当于包含了[i-k, i]之间的元素区间,则f[i][j] = f[i-k][j-1] + (Si - Sk)S表示前缀和

f[i][j]在其中取最大值。
上述过程有一种从右向左迭代的感觉

而由于题目里要求字典序从小到大,于是就要使用倒序DP
那么i就变为从末尾向前遍历,而f(i)也变成了以第i个元素为开头的区间,迭代从右向左变成了左向右,于是上述两种情况就变成了:

  1. 不包含Ai,则f[i][j] = f[i+1][j]
  2. 包含Ai,相当于包含了[i, i+k]之间的元素区间,则f[i][j] = f[i+k][j-1] + (Si+k - Si)S表示前缀和

然后再确定好x,区间上届,遍历即可找到答案。

class Solution {
public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {vector<int> ans;int n = nums.size();vector<int> s(n + 1);for (int i = 1; i < n + 1; ++i) {s[i] = s[i - 1] + nums[i - 1];}int x = n + 1;vector<vector<int>> f(n + 2, vector<int>(4));for (int i = n - k + 1; i > 0; --i) {for (int j = 1; j <= 3; ++j) {f[i][j] = max(f[i + 1][j], f[i + k][j - 1] + s[i + k - 1] - s[i - 1]);// 注意s的下标}if (f[x][3] <= f[i][3]) x = i;	// 这步是必须的,确定最小下标}int y = 3;while (y > 0) {while (f[x][y] != f[x + k][y - 1] + s[x + k - 1] - s[x - 1]) ++x;// 注意s的下标ans.push_back(x - 1);x += k;--y;}return ans;}
};

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

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

相关文章

富友支付最近“战况”

中国人民银行上海市分行官网在昨天披露了一份关于富友支付的行政处罚公示信息。富友支付因为涉嫌违法违规的反洗钱行为而遭到中国央行的罚款。 罚款金额达到455万&#xff0c;可谓相当可观。 当支付机构受到罚款处罚时&#xff0c;一些公司会选择在收到罚单后发表声明&#xff…

2023年亚太杯数学建模亚太赛ABC题思路资料汇总贴

下文包含&#xff1a;2023年亚太杯数学建模亚太赛A- C题思路解析、选题建议、代码可视化及如何准备数学建模竞赛&#xff08;23号发&#xff09; C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&#xff0c;帮助大家取得好成绩。2…

【GEE】基于GEE进行非监督学习

1 简介与摘要 之前写了多季节叠加的监督学习&#xff0c;所以这次简单写一个非监督学习吧。。 这次为了简单明了&#xff0c;就不整那么多虚的了&#xff0c;在这里我不叠图层了&#xff0c;有需要的可以参考前一篇博客自己添加输入的图层。 2 制作输入影像 首先&#xff0c…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

模块化Common JS 和 ES Module

目录 历程 1.几个函数&#xff1a;全局变量的污染&#xff0c;模块间没有联系 2.对象&#xff1a;暴露成员&#xff0c;外部可修改 3.立即执行函数&#xff1a;闭包实现模块私有作用域 common JS module和Module 过程 模块依赖&#xff1a;深度优先遍历、父 -> 子 -…

springboot(ssm邮件过滤系统 在线邮箱平台Java(codeLW)

springboot(ssm邮件过滤系统 在线邮箱平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09…

uni-app:前端实现心跳机制(全局)+局部页面控制心跳暂停和重新心跳

一、App.vue全局中写入心跳 在data中定义变量heartbeatTimer&#xff0c;便于暂停心跳使用在onLaunch中引用开始心跳的方法startHeartbeat()写入开始心跳方法写入暂停心跳方法写入请求后端刷心跳机制 定义变量 // 在全局设置的心跳机制中添加一个变量来保存定时器的标识 data(…

035、目标检测-物体和数据集

之——物体检测和数据集 目录 之——物体检测和数据集 杂谈 正文 1.目标检测 2.目标检测数据集 3.目标检测和边界框 4.目标检测数据集示例 杂谈 目标检测是计算机视觉中应用最为广泛的&#xff0c;之前所研究的图片分类等都需要基于目标检测完成。 在图像分类任务中&am…

html在线生成二维码(附源码)

文章目录 1.设计来源1.1 主界面1.2 美化功能 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134458927 html二维码生成&#xff08;附源码&#xff09;&#xff0c;生成二…

2023年中国农业机器人行业市场规模及发展趋势分析[图]

农业机器人是一种机器&#xff0c;是机器人在农业生产中的运用&#xff0c;是一种可由不同程序软件控制&#xff0c;以适应各种作业,能感觉并适应作物种类或环境变化&#xff0c;有检测(如视觉等)和演算等人工智能的新一代无人自动操作机械。 农业机器人分类 资料来源&#xf…

Redux-状态管理组件

一、简介 react中的状态只属于某个组件。而Redux是一个全局管理js状态的架构&#xff0c;让组件通信更加容易。 之前是状态在所有组件间传递&#xff0c;而redux通过store来实现这个功能。 Redux特性&#xff1a; 1.Single source Of truth&#xff0c;通过store唯一维护状态…

JDBC编程

1. JDBC 简介 1.1 JDBC概述 : JDBC : Java DataBase Connectivity&#xff0c;是Sun公司制定的Java程序连接和操纵数据库的一组应用接口标准 1.2 JDBC 编程步骤 (1) 引入 java.sql 包的所有类及接口。 (2) 加载相应数据库的JDBC驱动程序。不同数据库系统的JDBC驱动程序不同&…

多视图聚类的论文阅读(一)

当聚类的方式使用的是某一类预定义好的相似性度量时&#xff0c; 会出现如下情况&#xff1a; 数据聚类方面取得了成功&#xff0c;但它们通常依赖于预定义的相似性度量&#xff0c;而这些度量受原始方法的影响:当输入维数相对较高时&#xff0c;往往是无效的。 1. Deep Mult…

python爬取快手视频

原理 F12点击graphql能够看到里面有若干视频信息,一会儿要取其中的url地址 右键复制cURL 然后进入到这个转换器连接 https://curlconverter.com/python/ 点击这个连接复制上述信息,然后就能解析处下面的代码,拷贝到你的项目中替换cookies,headers,json_data 源代码 …

使用 Hugging Face Transformer 微调 BERT

微调 BERT有助于将其语言理解能力扩展到更新的文本领域。BERT 的与众不同之处在于它能够掌握句子的上下文关系,理解每个单词相对于其邻居的含义。我们将使用 Hugging Face Transformers 训练 BERT,还将教 BERT 分析 Arxiv 的摘要并将其分类为 11 个类别之一。 为什么微调 BER…

[和ChatGPT学编程]Python Requests 简介

requests 是一个流行的 Python 库&#xff0c;用于发送 HTTP 请求。它提供了简洁而友好的 API&#xff0c;使得发送 HTTP 请求变得简单而直观。requests 具有许多强大的功能&#xff0c;适用于各种 HTTP 请求场景&#xff0c;包括 GET、POST、PUT、DELETE 等。 目录 requests 库…

【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…

Docker Swarm: 容器编排的力量和优势深度解析

文章目录 Docker Swarm的核心概念1. 节点&#xff08;Node&#xff09;2. 服务&#xff08;Service&#xff09;3. 栈&#xff08;Stack&#xff09; 使用Docker Swarm1. 初始化Swarm2. 加入节点3. 创建服务4. 扩展和缩减服务5. 管理栈6. 管理服务更新 Docker Swarm的优势深度解…

shadow复习之planar shadow

planar shadow 通常来说 shadow都是画一个map 这个map有个很大的问题&#xff0c;那就是size有问题 你希望有很高的精度&#xff0c;就必定要用大size的图片&#xff0c;这显然是不太妙的 那么这里就出现一个取巧的法子&#xff0c;如果你只考虑投影到平面上&#xff0c;光源是…

分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测

分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于SDAE堆叠去噪自编码器的数据分类预测&#xff08;完整源码和数据) 2.多…