当前位置: 首页 > news >正文

最大m子段和

  • 问题描述
  • 解题思路
  • 伪代码
  • 代码实现
  • 复杂度分析

问题描述

给定一个有n(n>0)个整数的序列,要求其m个互不相交的子段,使得这m个子段和最大。
输入:整数序列{nums},m。
输出:最大m子段和。

对于m=1的情况,即求最大子数组和

解题思路

我们采用动态规划的思路解决这个问题:
根据常用的状态表示经验我们可以记dp[k][i]为前i个元素的最大k子段和,记last[k][i]为前i个元素中以nums[i-1]结尾的最大k子段和。

对于last[k][i]不难发现有两种情况:

  1. 若第k子段长度大于1,即last[k][i]=last[k][i-1]+nums[i-1];
  2. 若第k子段长度等于1,即last[k][i]=max{last[k-1]}+nums[i-1].则last[k][i]=max{last[k][i-1]+nums[i-1],max{last[k-1]}+nums[i-1]}.

容易得到dp[k][i]=max{dp[k],[i-1],last[k],[i]};
初始化last[1][1]=dp[1][1]=nums[0],last[1][i]=max{last[1][i-1]+nums[i-1],nums[i-1]},dp[1][i] = max(dp[1][i - 1], last[1][i]).

所求的最大m子段和即为dp[m][n].

伪代码

FUNCTION MaxSubArrayM(nums, m) :
Beginn ← LENGTH(nums)DECLARE last[1:n][1:m], dp[1:n][1:m]last[1][1] ← nums[0]dp[1][1] ← nums[0]FOR j FROM 2 TO n :last[1][j] ← MAX(nums[j - 1], last[1][j - 1] + nums[j - 1])dp[1][j] ← MAX(dp[1][j - 1], last[1][j])End For// 处理多子段FOR i FROM 2 TO m :dp[i][0] ← INT_MINlast[i][i - 1] ← INT_MINFOR j FROM i TO n :option1 ← last[i][j - 1] + nums[j - 1]  option2 ← dp[i - 1][j - 1] + nums[j - 1] last[i][j] ← MAX(option1, option2)dp[i][j] ← MAX(dp[i][j - 1], last[i][j])End ForEnd ForRETURN dp[m][n]
End MaxSubArrayM

代码实现

int MaxSubArrayM(vector<int>& nums,int m)
{vector<vector<int>>last(nums.size() + 1, vector<int>(m + 1)), dp(nums.size() + 1, vector<int>(m + 1));last[1][1] = dp[1][1] = nums[0];for (int i = 2; i <= nums.size(); i++){last[1][i] = max(nums[i - 1], nums[i - 1] + last[1][i - 1]);dp[1][i] = max(dp[1][i - 1], last[1][i]);}for (int i = 2; i <= m ; i++){dp[i][0] = last[i][i-1] = INT_MIN;for (int j = i; j <= nums.size(); j++){last[i][j] = max(last[i][j - 1] + nums[j - 1], dp[i - 1][j - 1] + nums[j - 1]);dp[i][j] = max(dp[i][j - 1], last[i][j]);}}return dp[m][nums.size()];
}

复杂度分析

时间复杂度:主要运行时间在两层for循环,故时间复杂度为O(mn).
空间复杂度:不难发现我们申请了m*n的两个vector,故空间复杂度为O(mn).

相关文章:

  • Costmap代价地图
  • ActiveMQ 高级特性:延迟消息与优先级队列实战(一)
  • Java中的线程
  • 编程题 02-线性结构3 Reversing Linked List【PAT】
  • Arduino快速入门
  • 组合数学——容斥原理
  • K8S Ingress、IngressController 快速开始
  • [数据结构高阶]并查集初识、手撕、可以解决哪类问题?
  • AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)
  • Matlab 空调温度时延模型的模糊pid控制
  • M8040A/M8199助力数据中心收发信机测试
  • 25、Tailwind:魔法速记术——React 19 样式新思路
  • 数据治理域——数据治理体系建设
  • Hive HA配置高可用
  • 多样本整合Banksy空间聚类分析(Visium HD, Xenium, CosMx)
  • AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
  • 深入浅出:Java 中的动态类加载与编译技术
  • 15.three官方示例+编辑器+AI快速学习webgl_buffergeometry_instancing
  • IOT藍牙探測 C2 架構:社會工程/節點分離防追尋
  • Windows下安装Docker Desktop到C盘以外的盘
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准
  • 教育部基础教育教指委:小学阶段禁止学生独自使用开放式内容生成功能
  • “80后”李灿已任重庆市南川区领导,此前获公示拟提名为副区长人选
  • 数说母亲节|全球11亿女性进入更年期,“不是忍忍就好”
  • 印度外交秘书:印巴军方将于12日再次对话
  • 欧盟决意与俄罗斯能源彻底决裂之际,美国谋划新生意:进口俄气对欧转售