最大连续子序列和

对于给定的数组 numnum,一个长度为 ss 的连续子序列是指由 num_i,num_{i+1},num_{i+2}\ldots,num_{i+s-1}num?i??,num?i+1??,num?i+2??…,num?i+s−1?? 组成的序列。数组中的元素有可能为正数、负数或 00。你需要从数组中找出元素总和最大的一个连续子序列。

比如,对于数组 1,-3,2,6,-5,81,−3,2,6,−5,8,其最大连续子序列之和是 2+6-5+8=112+6−5+8=11。

对于一段区间内的最大连续子序列和,我们能不能借助分治思想,将这个大问题拆分成两个子问题,然后将两个子问题的解合并为大问题的解呢?

解法

我们记录一段子区间 [x,y][x,y] 的三个结果:从最左端向右的最大连续子序列 [x,y]_{lmax}[x,y]?lmax??、从最右端向左的最大连续子序列 [x,y]_{rmax}[x,y]?rmax??、区间内的最大连续子序列 [x,y]_{max}[x,y]?max??(没有是否靠着某个端点的限制)。

对于区间 [a,b][a,b],我们可以先递归地求解两个子区间 [a,mid],[mid+1,b][a,mid],[mid+1,b] 的三个值 lmax,rmax,maxlmax,rmax,max。之后,对两个子区间进行合并:

  • 对 [a,b][a,b] 区间从左向右循环扫描,计算 [a,b]_{lmax}[a,b]?lmax??;
  • 对 [a,b][a,b] 区间从右向左循环扫描,计算 [a,b]_{rmax}[a,b]?rmax??;
  • 将 [a,b]_{lmax}[a,b]?lmax??、[a,b] _{rmax}[a,b]?rmax??、[a,mid] _{rmax}+[mid+1,b] _{lmax}[a,mid]?rmax??+[mid+1,b]?lmax??、[a,mid] _{max}[a,mid]?max??、[mid+1,b] _{max}[mid+1,b]?max?? 这五个数的最大值作为 [a,b] _{max}[a,b]?max?? 的结果,结束当前区间的计算。

这个算法和归并排序非常像,时间复杂度也和归并排序一致,是稳定的 \mathcal{O}(nlogn)O(nlogn)。

时间: 2024-08-27 06:46:16

最大连续子序列和的相关文章

hdu1231 最大连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22849    Accepted Submission(s): 10135 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

dp-最大连续子序列的和

什么是最大连续子序列和呢 ? 最大连续子序列和是所有子序列中元素和最大的一个 . 问题 : 给定一个序列 { -2, 11, -4, 13, -5, -2 } , 则最大连续子序列和为 20 , 即 { 11 , -4 , 13 } . 分析 : 要怎样去解决这个问题呢 ? 设出 两个变量 , 一个 ans 用来存放最终的结果 , 一个用来现在对元素进行加和 , 每当有最大的和则更形下 ans . 代码示例 : #include <iostream> #include <cstring&

HDU1231 最长连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31687    Accepted Submission(s): 14214 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

动态规划:最大连续子序列和

问题:给出一个数组,求其连续子序列的最大和 package 动态规划; /** * 给出一个数组,求其连续子数组的最大和 * @author Administrator * */ public class MaxSum { public static void main(String[] args) { int[] arr = new int[]{-3,1,-3,4,-1,2,1}; int max=arr[0]; int current=arr[0]; for(int i=1;i<arr.le

UVa 108 - Maximum Sum(最大连续子序列)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44  Maximum Sum  Background A problem that is simple to solve in one dimension is often much more difficult to solve in more th

[pythontip]最大非连续子序列

题目链接:http://www.pythontip.com/coding/code_oj_case/36给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和. 这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻. 例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]). dp首先复制L序列的元素,然后比较前两个元素,确定最优解赋值给dp[1]. 1 # L=[2,-3

最大连续子序列乘积

问题描述 给定一个整数序列(可能有正数,0和负数),求它的一个最大连续子序列乘积.比如给定数组a={3, -4, -5, 6, -2},则最大连续子序列乘积为360,即3*(-4)*(-5)*6=360. 分析 求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0. 假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程

《github一天一道算法题》:分治法求数组最大连续子序列和

看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

HDU 1231 最大连续子序列 DP题解

典型的DP题目,增加一个额外要求,输出子序列的开始和结尾的数值. 增加一个记录方法,nothing special. 记录最终ans的时候,同时记录开始和结尾下标: 更新当前最大值sum的时候,更新开始节点. const int MAX_N = 10001; long long arr[MAX_N]; int N, sta, end; long long getMaxSubs() { long long sum = 0, ans = LLONG_MIN; int ts = 0; for (int