最大子序列和问题

最大子序列和问题以及确定序列起终点位置 在学习数据结构遇到的第一个问题就是一个最大子序列和的问题,以PAT(点击打开链接)上的一道题作为例子来总结一下求解这类问题时一些常用的方法。网上讲述子列和问题的博客及文章已经很多了,这里就不在阐述穷举法和递归法的方式来求解了,有需求的小伙伴可以去谷歌然后百度一下。这篇博文重点讲解一下最优时间复杂度的的线性处理方式和一点点关于这个问题的扩展。 首先上的这幅图就是PAT上的那道题,想深入了解就自己点 阅读详情

这是在《数据结构与算法分析 Java语言描述中文第二版》里的一个问题。本文记载我对书中该问题的第四种解法的理解。

问题:

分析:数列的最大子序列必定是以j结尾的,其中,j属于[A1,AN]。首先,我们计算出以j结尾的子序列中的最大子序列的和;然后,因为j有N个值,也就是说第一步得到N最大子序列的和,这N个值中最大的那一个就是最终答案。从N个数中找出最大值是很容易的。关键是,在以j结尾的子序列中,哪一个是最大的。下面来分析解决这个问题。


局部看:

存在子序列:A1,A2,A3...Ai...A(j-1),Aj。我们现在的问题是,求这个序列的以Aj结尾的子序列的和中的最大值?

                            Sum = Aj + A(j-1) + ...Ai...+ A3 + A2 + A1;

其中,只有Aj是必须的。

我们的目的去掉A1,A2,A3...,使得Sum值最大。我们知道,减去一个负数可以使一个数变大,所以如果A1 + A2 + A3 + ... A(i-1)< 0,那么:

                       Aj + A(j-1) + ...Ai > Aj + A(j-1) + ...Ai...+ A3 + A2 + A1;

如果Ai + ...  + A(k-1) < 0,其中k < j。那么:

                      Aj + A(j-1) + ...Ak >Aj + A(j-1) + ...Ai;

也就是说,不断去掉和为负的前缀序列,以Aj结尾的子序列的和就会不断变大。当所有和为负的前缀序列都去掉时,以Aj结尾的子序列的和就变到最大了。因为这时,Aj结尾的子序列的任意前缀序列的和都是大于等于0的,减去任意前缀序列最多使和不变,甚至变小。

此时,我们找到了求这个序列的以Aj结尾的子序列的和的最大值的方法,就是去掉序列中所有和为负的前缀序列。


全局看:

                 Sum(j-1) = A(j-1) + ...Ai...+ A3 + A2 + A1;

                  Sum(j) = Aj +Sum(j-1);

如果Sum(j-1)< 0,就应该去掉。


结合源代码来做个总结:

public int maxSubSum(int[] a) {
		int maxSum = 0;
		int thisSum = 0;
		for(int j = 0; j < a.length; j++) {
			thisSum += a[j];
			if(thisSum > maxSum) {
				maxSum = thisSum;
			}
			// 和为0的序列不可能是最大子序列的前缀,删掉
			if(thisSum < 0) {
				thisSum = 0;
			}
		}
		return maxSum;
	}

for循环的每一次迭代计算一个以Aj结尾的序列的最大子序列和thisSum。如果thisSum < 0,这个值将被设为0,也就是说,它所代表的序列不能作为以Aj后面的元素结尾的序列的最大子序列的前缀。按照这个过程,其实,在计算以Aj结尾的序列的最大子序列和thisSum时,Aj所有和为负的前缀序列都去掉了。


书中阐释这个算法正确性的部分的意思是这样的:和为负的序列不可能作为最大子序列的前缀,并且,存在序列Ai,A(i+1),A(i+2),A(i+3)...A(j-1),Aj。如果Ai,A(i+1),A(i+2),A(i+3)...A(j-1),不能作为Aj的前缀序列,那么A(p)...A(j-1)也不能作为Aj的前缀,其中i<p<j。因为如果Ai+A(i+1)+A(i+2)+A(i+3)+ ...+ A(j-1)<0的话,那么A(p)+...+A(j-1)<0也是成立的,因为Ai...A(p-1)作为另一个可能的最大子序列的前缀,该序列的和必定大于等于0。Ai,A(i+1),A(i+2),A(i+3)...A(j-1)少了Ai...A(p-1)不可能使数列的和变大。

我认为从这个解释直接到上面的代码跨度太大了,所以才有上文更仔细的解释。

最大子序列和问题·联机算法 最大子序列和问题·联机算法 题目 给定(可能有负的)整数A1,A2,...,ANA_1, A_2, ..., A_NA1​,A2​,...,AN​,求∑k=1nAk\sum_{k=1}^n A_k∑k=1n​Ak​的最大值。(为方便起见,如果所有整数均为负数,则最大子序列和为0) 易知 若AiA_iAi​<0,则AiA_iAi​不可能为最大子序列和的起点。(因为总能通过Ai+1A_{i+1}Ai+1​作起点优化最大子序列) 设序列其各项和为Aij,其各项和为∑k=ijAk=Ai+Ai+1+...+A 阅读详情

相关推荐

最大的子序列和问题

最大的子序列和问题是一个很经典的问题,各种考试面试中也经常碰到。这问题的解决不难,关键是通过这个问题体会一些算法的思路,学习思考怎么解决问题。 问题是这样的:给定整数A1,A2,...,An(正负不限),Ai,...,Aj(1 最直接也最容易想到的办法(当然也就是最暴力的方法),就是求出所有子序列的和,然后找出最大的。按照这个思路写出的C++代码如下: int Method1

tyst08的专栏 657

算法复盘 ~ 前缀和经典问题 ~ 连续的子数组和

连续的子数组和 523. 连续的子数组和 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。 如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。 输入:nums = [23,2,4,6,7], k = 6 输出:true 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。 思路一:

Gopuwe的博客 604

ECU-TEST笔记&使用技巧01

说明 1)所述均基于如下环境:ECU-TEST 8.0、Win10系统、NI Veristand 2018(HIL测试)。不排除因为版本及软件环境问题,所述方法不奏效或有更好的方法,欢迎交流,一起提高。 2)本博客以问答形式进行,所述问题均来自于实际测试(包括MIL、HIL测试)遇到的问题及需求,目的是提高测试效率和自动化测试序列的可维护性。 3)本博客尽量从测试方法及ECU-TEST原...

Eigrl的博客 1万+

HDU - 1231 最大连续子序列 (前缀和)

题意: 中文 思路: 维护前缀和,最小前缀和,可以计算出每个右端点的最大子序列。 代码: #include using namespace std; const int MAXN=1e4+7; int a[MAXN],b[MAXN]={0},c[MAXN]; int main() { int n; while(scanf("%d",&n)&&n){ f

DT2131 1035

基于C#的跨平台上位机开发:一次编写,多平台运行

摘要: 本文探讨了如何利用C#进行跨平台上位机开发,以适配Windows、Linux、macOS等多平台需求。通过分析传统单平台开发的局限性(如API差异、硬件接口兼容性),提出基于.NET 5/6/7的解决方案,重点推荐Avalonia(类WPF的跨平台UI框架)和GtkSharp(基于GTK+)实现图形界面。同时,针对硬件通信需求,介绍了System.IO.Ports串口通信和LibUsbDotNet的跨平台支持,并强调多平台调试(VS Code、Docker)的重要性,最终实现一次编码、多端部署的高效

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1409

学习笔记9--智能驾驶的功能安全设计之功能安全设计

本系列博客包括6个专栏,分别为:《自动驾驶技术概览》、《自动驾驶汽车平台技术基础》、《自动驾驶汽车定位技术》、《自动驾驶汽车环境感知》、《自动驾驶汽车决策与控制》、《自动驾驶系统设计及应用》。此专栏是关于《自动驾驶系统设计及应用》书籍的笔记.

FUXI_Willard 1795

子段和分类 前缀和 dp

51nod 1049 #include #include #include #include using namespace std; const int maxn=1e5; int n,cnt; long long a[maxn],f[maxn],maxs; void fu(int n){ f[1]=a[1]; for(int i=2;i<=n;i++){ f[i]=ma

RockyHOO1209的博客 446

opencv的cmake报错

1、下载 ippicv_2021.8_win_intel64_20230330_general.zip、v0.1.2a.zip、opencv_videoio_ffmpeg.dll、opencv_videoio_ffmpeg_64.dll、ffmpeg_version.cmake。由于下载源在https://raw.githubusercontent.com,由于网络原因下载不顺畅,可以先找到文件下载到对应文件夹下,或者更改网络环境。ffmpeg_version.cmake文件,打开后显示如下, 另存即可。

nownow_的博客 1299

前缀和与差分——子序列蓝桥原题

7-8 H.zx学长的蓝桥原题 (90分) 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间.你能求出数列中总共有多少个K倍区间吗? 输入格式: 第一行包含两个整数N和K。(1 <= N, K <= 100000) 以下N行每行包含一个整数Ai。(1 &l...

jhckii的博客 356

振镜控制卡硬件接口揭秘:XY2-100/SL2-100协议对比

本文对比分析了工业振镜控制领域两种主流数字通信协议XY2-100和SL2-100的硬件接口差异与应用场景。XY2-100作为开放式协议兼容性强,采用LVDS差分信号传输,适用于激光打标等中高精度场景;SL2-100为半封闭协议,采用RS485差分信号,专为高速响应场景设计。文章详细解析了两种协议的引脚定义、通信机制和性能参数,指出XY2-100适配多品牌振镜且调试简单,SL2-100则更适合Nutfield专用设备的高速高精度需求。最后提供了接口调试的实操建议和选型逻辑,强调应根据具体应用场景的精度、速度和

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 647

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2729

最大子序列和问题的四种算法

转自网易博客http://blog.163.com/lichunliang1988116@126/blog/static/2659944320124115795/        云栖社区https://yq.aliyun.com/articles/40323 问题描述:给定(可能有负数)整数序列A1,A2,A3,...,An,求这个序列中子序列和的最大值。(为方便起见,如果所有整数均为

ChinMint的博客 1974

SmartFusion从FPGA到ARM(一)——MSS_GPIO点灯

文章目录前言GPIO点灯 前言 GPIO点灯

whik1194的博客 5271

求解最大连续子序列和问题———分治法

一、问题描述 给定一个有n(n >= 1)个整数的序列,求出其中最大连续子序列的和。例如序列(34,-20,30,-50,60,-20,30,41,-30,-10)最大子序列和为111,序列(-2,11,-4,13,-5,-2)最大子序列和为20。规定一个序列的最大连续子序列和至少为0。 二、问题求解 1、对于含有n个整数的序列,若n=1,表示序列仅有一个元素,该元素大于0,则返回该元素,否则返回0。 if(left == right){ if(a[left]>=0) return a[l

留小乙的博客 1万+

黑猫带你学UFS协议第23篇:UFS固件升级操作详解(FFU)

摘要:本文介绍了UFS固件更新(FFU)的实现方法与注意事项。根据UFS3.1 JEDEC协议,FFU通过write buffer命令(MODE=0Eh)下载FW固件,随后必须进行power cycle或硬件复位生效。文章详细阐述了FFU操作的10条规则,包括数据分片传输要求、寄存器访问限制等,同时指出协议未明确的厂商实现差异。关键寄存器包括bFFUTimeout、bDeviceFFUStatus和fPermanentlyDisableFwUpdate。

黑猫奥利奥的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最大子序列和问题的求解

本文给出求解最大子序列和问题的4个算法

m0_62361897的博客 1629

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最大子序列和问题、蓝桥:和最大子序列

import java.util.Scanner; public class 最大子序列和问题 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] a=...

Claire的博客 270

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法小题:最大连续子序列和问题

最大连续子序列和问题前言问题描述解法一分析代码解法二分析代码解法三分析代码解法三(番外版)分析代码实验结果 前言 刷题的时候遇到了这个最大连续子序列和的问题,查阅研究了一下。记录在此。希望能够便人便己。 问题描述 给定一个数组a[ n ] ,数组元素均为自然数集(有正数,有负数),请求出该数组一个连续的子序列,使得这个子序列的和值最大,示例如下 a[] = {1, 2, -9, 5, 6, -3, 7, 8, -89, 10} 那么它的最大连续子序列为 {5,6,-3,7,8} ,和值 = 23 说明:偷

xiaopan的博客 2721

最大子序列和问题的解

最大的子序列和问题:给定整数A1,A2,......,AN(可能有负数),求∑Ak(k=i...j)的最大值。(为方便起见,如果所有整数均为负数,则最大子序列和为0) 例:输入-2,11,-4,13,-5,-2时,答案为20(从A2到A4) 解法一: int MaxSubsequenceSum( const int A[], int N ) { int ThisSum, M

ziyoudefeng的专栏 713

最大子序列和问题求解与分析

一、问题描述 最大子序列和问题是要在 个数中寻找一个子序列和,该子序列和是所有个数中选择的子序列中的最大值。形式化为: , ...

gaoxueyi551的专栏 478

PAT上的最大子序列和问题

PAT上的最大子序列和问题 Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj } where 1 Maximum Subsequence is the continuous subsequence whi

yangxuanhe的专栏 994

动态规划法-最大连续子序列和问题

我们有一个数字序列,例如 1, -2, 3, 4, -10, 6。我们的目标是找出这个序列中连续数字相加得到的最大和。

qq_52291558的博客 1567

最大子序列和问题的思考

/* * 问题描述: * 最大的子序列和问题:给定整数A1, A2, ....AN (可能有负数), *      求Ak到Aj的最大和值k--j是连续的 *      可以给出线性的算法(看MaxSubsequenceSum2.cpp) */#include #define  NUM 8void main( void ){ // // set the number // int sour

Robin's Log 1433

NOJ-1576-最大连续子序列和问题

最大连续子序列和问题 描述: 给定一整数序列A0,A1, A2,… An-1 (可能有负数),求A0An-1的一个连续子序列AiAj,使得Ai到Aj的和最大。 输入: 先输入一个正整数n(1<n<1000),再输入n个整数。 输出: 输出最大连续子序列的和。 输入样例: 102 -1 5 -7 2 -1 4 -2 4 -5 输出样例: 7 思路 代码还没有AC,NOJ评测机炸了,但是这个O(n)的思路大概是对的:sum[i]为前i个数字的连续子序列的最大和。如果sum[i-1]<0,那

Phoenix_ZengHao的博客 901
上一篇: 深入理解计算机系统 1.3 理解编译系统如何工作是有回报的
下一篇: Java中,一个接口可以extends多个接口
云聪
博客等级 码龄15年 171粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值