最大连续和-高效算法

Verilog基本代码结构及常用语句always、begin...end解读 Verilog基本代码结构及常用语句always、begin...end解读 线性反馈以为寄存器(LFSR) 阅读详情

求一个序列的最大连续区间和(有负数),可以前缀和,但是复杂度高。下面是复杂度为O(n)的高效算法。紫书P224,详情见代码注释。
后面还有分治递归的版本,复杂度O(n);

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<cstring>
#include<string>
#include<cmath>

using namespace std;

typedef long long LL;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i = a;i <= b;++i)
#define rep(i,a,b) for(int i = a;i >= b;--i)
const int maxn = 3e5;
int n = 0,m = 0;
int a[maxn+10];
int s[maxn+10];
int sm[maxn+10];//记录从1-j中最小的s的下标i,s[j] - s[i-1]最大,固定 s[j],相当于使s[i-1]最小
//然后扫描一次数组,维护目前遇到过的最小S
//复杂度O(n) ,紫书224页 

int main(){
	while(~scanf("%d",&n)){
		int l = 0,r = 0;//记录所求区间的端点值 
		memset(s,0,sizeof(s));
		 
		per(i,1,n){
			scanf("%d",&a[i]);
			s[i] = s[i-1] + a[i];
		}
		int mins = 0,min_id = 0;
		sm[1] = 0;
		per(i,2,n){//录从1-i中最小的sj的下标j ,s[j] - s[i-1]最大,固定 
			if(s[i-1] < mins){//取不取等号,要根据实际情况来 
				mins = s[i-1];
				sm[i] = min_id = i-1;
			}else{
				sm[i] = min_id;
			}
		}
		int maxv = -INF;
		per(i,1,n){
			if(s[i] - s[sm[i]] > maxv){
				l = sm[i] + 1;r = i;
				maxv = s[i] - s[sm[i]];
			}
		}
		
		printf("%d %d : %d\n",l,r,maxv);
	}
	
	
	return 0;
}

下面是归并的版本,复杂度O(nlogn):

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<cstring>
#include<string>
#include<cmath>

using namespace std;

typedef long long LL;

#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define mem(a,b) memset(a,b,sizeof(a))
#define per(i,a,b) for(int i = a;i <= b;++i)
#define rep(i,a,b) for(int i = a;i >= b;--i)
const int maxn = 3e5;
int n = 0,m = 0;
int a[maxn+10];
int max_sum(int *a,int x,int y){//返回数组左开右闭区间[x,y)中的最大连续和 
	if(y - x == 1){
		return a[x];//只有一个元素,直接返回 
	} 
	int mid = (y - x) / 2 + x;//分治第一步:划分成[x,mid),[mid,y) 
	int maxs = max(max_sum(a,x,mid),max_sum(a,mid,y));//分治第二步:递归求解 
	int maxv = 0;
	int l = a[mid-1];//不能初始化为0,因为输入有负数,下面max会出错 
	rep(i,mid-1,x){//分治第三步:合并(1)-从分界点开始往左的最大连续和 
		l = max(l,maxv += a[i]);
	}
	maxv = 0;
	int r =a[mid];
	per(i,mid,y-1){//分治第三步:合并(2)-从分界点开始往右的最大连续和 
		r = max(r,maxv += a[i]);
	}
	return max(maxs,l+r);//将子问题的解与l+r比较 
}
int main(){
	while(~scanf("%d",&n)){
		per(i,1,n){
			scanf("%d",&a[i]);
		}
		printf("%d\n",max_sum(a,1,n+1));
	}
	
	
	return 0;
}

MT25QL256完整操作指南:从ID读取到4KB扇区擦除(附华大SPI例程) 本文提供了MT25QL256 NOR FLASH在华大MCU上的完整驱动开发指南。内容涵盖从SPI初始化、器件ID读取、状态寄存器查询,到核心的页编程和4KB扇区擦除操作,并分享了构建健壮驱动框架、处理跨页写入及常见调试问题的实战经验。 阅读详情

相关推荐

DATCOM GUI——DATCOM-Tools使用介绍

简介 本工具以1976年美国空军稳定性与操纵性计算程序(USAF STABILITY AND CONTROL DIGITAL DATCOM PROGRAM)为基础进行开发,目的是提供更为简洁方便的外形输入方式,并带有三维绘图与气动特性输出功能。 安装与环境配置 1、 代码以Holy Cows公司提供的DATCOM程序为基础,首先下载其安装包(window,Linux均有)。 2、 安装到你想要的位置,注意不要有中文路径 3、 测试DATCOM是否能够正常运行。复制examples文件夹中的Citation

qq_40800981的博客 1万+

连续和

题目描述对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1),这些连续的自然数段中的全部数之和为M。例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。输入包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)输出每行两个自然数,给出一个满足条件的连续自然数段中的第一个...

Richard的博客 203

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 253

连续和的求取方法—C语言

连续和的求取方法—C语言 方法1:直接利用循环进行累加,最后得到结果。 #include<stdio.h> int main() { int n,i; int sum = 0; scanf_s("%d", &n); for ( i = 0; i < n; i++) { sum += i; } printf("%d", sum); return 0; } 方法2:利用数学中学过的等比数列求和公式:(a1+an)*n/2。首项加尾项乘以项数除以二,得到最后的连续和

Miracle_of_Dec的博客 1921

Kubeflow系统性学习教程:从入门到高级实践

Kubeflow学习教程摘要(150字): Kubeflow是基于Kubernetes的云原生MLOps平台,提供端到端机器学习解决方案。核心功能包括Jupyter Notebooks开发环境、Pipelines工作流编排、分布式训练支持和模型服务部署。教程采用三阶段学习路径:初学者搭建Kind集群体验Notebooks;中级开发自定义Pipeline组件;高级实现企业级应用。通过容器化和K8s CRD深度集成,解决环境一致性、实验跟踪和资源调度等MLOps痛点,相比MLflow/Airflow更适合大规模

自可乐的博客 888

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4007

约瑟夫问题(Java环形列表实现)

package linkedList; public class Joseph { public static void main(String[] args) { CircleLinkList cir = new CircleLinkList(); cir.addBoy(15); cir.getAllInfo(); cir.countBoy(1, 2, 15); } } // 创建环形的单向链表 class CircleLinkList { // 创建一个first检点 pri.

weixin_43724848的博客 538

【C#程序员入门AI】AI应用的操作系统:Semantic Kernel 2026实战

用户ID用户信息

人工智能AI技术 1251

最大和(双指针、前缀和)

3493. 最大的和 问题重述: 给定一个长度为 n的正整数数列 a1,a2,…,an。 初始时,数列中的每个元素要么处于可选状态,要么处于不可选状态。 你可以选择一个长度恰好为 k 的区间 [i,i+k−1],使得 ai∼ai+k−1 这 k 个元素的状态全部变为可选。 请问,在经过此操作后,所有处于可选状态的元素之和最大是多少。 输入格式 第一行包含两个整数 n和 k。 第二行包含 n个整数 ai。 第三行包含一个长度为 n 的 01 序列,如果第 i个数为 1,表示 ai 的初始状态为可选,如果第 i

m0_46564120的博客 373

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1241

使用MATLAB实时处理摄像头图像

本文介绍了如何使用MATLAB进行实时图像处理,包括从摄像头获取图像、对图像进行处理并显示处理结果。我们将演示如何使用MATLAB的图像处理工具箱来实现常见的图像处理任务,如图像增强、边缘检测和物体检测。

XsiJava的博客 921

算法竞赛入门经典:第八章 高效算法设计 8.1动态规划之最大连续和

/* 最大连续和: 给出一个长度为n的序列A1,A2,...,An,求最大连续和。换句话说,要求找到1<=i <= j<=n,使得Ai+Ai+1+..+Aj尽量大 b[i] = { b[i-1] + a,b[i-1] > 0 {a,b[i-1] <0 输入: 8 1 -2 3 10 -4 7 2 -5 输出: 18(3 10 -4 7 2) */ /*

qingyuanluofeng的专栏 864

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景,标定效果都不理想(推荐场景是楼梯间),看来港大的更适合avia之类窄角度的雷达。如果标定效果不好的话,就使用 getExt2节点,getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。

z1872385的博客 2401

高效算法设计_算法分析初步(最大连续和)

算法分析初步渐进时间复杂度 基本操作的数量往往可以写成关于“输入模式二”的表达式,保留最大象并忽略系数后的表达式称为算法的渐进时间复杂度。 最大连续和六种姿势拿下最大序列和 嗯。。。我们三种就够折腾了。题目:给出一个长度为n的序列A1,A2,…..,An,求最大连续和。输入:6 -2 11 -4 13 -5 -2 输出:20 1 O(n^3)使用三次循环,计算每一个序列和的大小,然后和bes

qq_31060183的博客 303

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

算法_最大子序列和问题

package com.utils.algorithm; import java.util.ArrayList; import java.util.Random; public class MaximumSubsequenceSum { //最大子序列和问题 public static void main(String[] args) { ...

weixin_30914981的博客 133

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

最大连续子序列和

问题:最大连续子序列和 问题描述: 给出一个长度为 n 的序列 A1,A1,···,An,求最大连续子序列和。换句话说, 要求找到 1 方案1、       按正常逻辑进行处理,求出每一个元素开头的所有子序列和,找到其中最大的那个。       代码: best = A[1]; for( int i = 1; i <= n; i++ ) for( int j = i; j <=

402

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

51nod 1050 循环数组最大子段和(最大连续子段问题)

N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。 Input 第1

Tezuka 754

PAT甲级1007 最大连续子序列和(动态规划)

题目链接:传送门 正常的最大连续子序列和,加一点点处理记录一下最大和的起始数字和结束数字。 #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<set> #include<queu...

WAR 225

最大和子矩阵

题目描述 有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。 给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。 测试样例: [[1,2,-3],[3,4,-5],[-5,-6,-7]],3 返回:10 class SubMatr

烟雨流年 530

求 最大 连续子序列和?动态规划经典算法!

首先,题目要求求出连续子序列的和的值为最大的子序列,有点绕口,多读几遍就清楚了。一个序列有大量的连续子序列(排列组合问题了),要从众多子序列中挑出和的值为最大的那个序列。暴力解决的思路很简单,直接遍历所有的连续子序列并求它们的和,分别对比和的大小,取最大的值即可,时间复杂度为n^2。 但是,算法之所以简单,在于它的高效性。换个思路:我们其实并不需要求出每个连续子序列的和。有一个既定事实,那就是每...

qq_28447725的博客 531

HDU1231“最大连续子序列”

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 这个题就是模板 int maxsequence3(int a[], int len) { int maxsum, maxhere; maxsum = maxhere = a[0]; //初始化最大和为a【0】 for (int i=1; i&lt;len; i...

喜欢做一些demo,和分享遇到的 BUG 150

和最大字串以及最大上升子串(C语言)

和最大字串(C语言) 参考博客:https://www.cnblogs.com/activeshj/p/4090817.html 问题描述 给你一个整型数组,其中的元素有正有负也有0,要求你找到一个连续的子串,子串的所有元素之和是所有的连续子串中最大的。 例子:给定一组数,n个,有正,有负。要求找到和最大的连续子串,比如: 5 , 4, -10, 11, 2, 8, -5, 4, 2,-3,1 可以判断出和最大的连续子串是: 11, 2, 8, -5, 4, 2 其和为22 。 算法思路 如果暴力解法

Weightlessly的博客 1161

1007. Maximum Subsequence Sum (25),最大连续子串和

Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a sequence of K integers { N1, N2, …, NK }. A continuous subsequence is defined to be...

Become hunger become strong 371

最大子序和

题目: https://leetcode-cn.com/problems/maximum-subarray/ class Solution: def maxSubArray(self, nums: List[int]) -> int: if len(nums) == 1: return nums[0] s = float(...

weixin_39776217的博客 122

最大连续和(题解)

题目描述:给出一个长度为n 的序列A1,A2,...,An,求最大连续和。换句话说,要求找到1<=i<=j<=n,使得Ai+Ai+1+...+Aj 尽量大。 输入格式: 第一行输入n(1<=n<=50000)。 接下来1 行输入序列的n 个元素,第i+1 行为Ai(|Ai|<=10000)。 输出格式: 输出一个数表示最大连续和。 样例输入输出: ...

weixin_33872660的博客 277

扫描算法求一个向量的元素和最大的连续子向量

来源于《编程珠玑》第八章的介绍:求一个向量的元素和最大的连续子向量,使用扫描算法可以将计算量化简到O(n)量级。问:向量X  = { -2, 7, 1, -6, -2, 9, 2, -1 }(n=8) , 求它的和最大的连续子向量。先看求解过程:X                { -2, 7, 1, -6, -2, 9, 2, -1 }max_end   {   0, 7, 8,  2, 0, 9, 11,10 } max_end = max( max_end + X(i), 0)max_sofar {

musiccow的专栏 1354
上一篇: UVA140-Bandwidth(回溯法-双剪枝)
下一篇: CodeForces541div2-B-Draw!(有详细推导)
Mavis code
博客等级 码龄9年 13粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值