求最大连续和的几种方法

2023-11-18

本文内容参考《算法竞赛入门经典第2版》220~223页
Q:给出一个长度为 n n n的序列 A 1 , A 2 , A 3 , ⋯   , A n A_{1},A_{2},A_{3},\cdots,A_{n} A1,A2,A3,,An,求最大连续和。换句话说,要求找到 1 ≤ i ≤ j ≤ n 1\leq i\leq j \leq n 1ijn,使得 A i + A i + 1 + ⋯ + A j A_{i}+A_{i+1}+\cdots+A_{j} Ai+Ai+1++Aj尽量大。
方法一:
暴力枚举,时间复杂度 O ( n 3 ) O(n^{3}) O(n3)

ans=A[1];//所求的最大连续和 
for(int i=1;i<=n;i++){
	for(int j=i;j<=n;j++){//枚举区间[i,j] 
		int sum=0;
		for(int k=i;k<=j;k++){//对区间[i,j]内的所有数求和 
			sum+=A[k];
		}
		ans=max(sum,ans);//取最大值 
	}
}

方法二:
利用前缀和,时间复杂度 O ( n 2 ) O(n^{2}) O(n2)

s[0]=0;
for(int i=1;i<=n;i++){//提前求前缀和(s[i]表示从A[i]数组从1到i的所有数之和),降低时间复杂度 
	s[i]=s[i-1]+A[i];
}
ans=s[0];
for(int i=1;i<=n;i++){
	for(int j=i;j<=n;j++){
		ans=max(ans,s[j]-s[i-1]);
	}
}

方法三:
分治法,时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

int maxSum(int*A,int x,int y){//返回数组在左闭右开区间[x,y)中的最大连续和 
	if(y-x==1){
		return A[x];
	}
	int m=x+(y-x)/2;//划分成[x,m)和[m,y) 
	int maxs=max(maxSum(A,x,m),maxSum(A,m,y));
	int v,L,R;
	v=0;
	L=A[m-1];
	for(int i=m-1;i>=x;i--){//从分界点往左的最大连续和 
		L=max(L,v+=A[i]);
	}
	v=0;
	R=A[m];
	for(int i=m;i<y;i++){//从分界点往右的最大连续和 
		R=max(R,v+=A[i]);
	}
	return max(maxs,L+R);//子问题的解与L和R比较 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求最大连续和的几种方法 的相关文章

  • 回溯算法 解题思路

    文章目录 算法介绍 回溯算法能解决的问题 解题模板 1 组合问题 2 N皇后问题 算法介绍 回溯法 Back Tracking Method 探索与回溯法 是一种选优搜索法 又称为试探法 按选优条件向前搜索 以达到目标 但当探索到某一步时
  • 数据结构---归并排序

    归并排序 第一步 分组 第二步 归并 归并操作 第一步 第二步 第三步 JAVA实现 总结 第一步 分组 第1层分成2个大组 每组n 2个元素 第2层分成4个小组 每组n 4个元素 第3层分成8个更小的组 每组n 8个元素 一直到每组只有一
  • 二叉树:链式存储结构基础操作(C语言)

    操作包含 1 二叉树的构造 先序序列和中序序列 中序序列和后序序列 2 利用三种遍历方式输出 先序遍历 中序遍历 后序遍历 层次遍历 每种遍历包含递归和非递归两种算法 3 栈和队列的构造 C 模板 均为顺序存储结构 main cpp 1 构
  • 数组中子数组和为固定值的题目汇总

    开头附件一部分数组去重的知识 C 中数组 Vector中去除重复元素 unique函数是一个去重函数 去除相邻中的重复元素 只留一个 其中 最关键的是 并不是删除并不是把重复的元素删除 而是全部放倒数组的后面 因为 unique只是去除 相
  • 如何实现概率性事件

    游戏中经常会遇到概率性的问题 比如装备升级的成功率 合成宝石的成功率 洗装备时出现随机属性条数的概率等 这些概率性事件具体是怎么实现的呢 在网上看了一些相关的文章 总结一下 首先需要了解两个函数rand 和srand 下面是百科里面的解释
  • 分治法时间复杂度求解:主定理、代换法和递归树

    分治策略 分解 将原问题划分成形式相同的子问题 规模可以不等 对半或2 3对1 3的划分 解决 对于子问题的解决 很明显 采用的是递归求解的方式 如果子问题足够小了 就停止递归 直接求解 合并 将子问题的解合并成原问题的解 这里引出了一个如
  • 【C】PTA期末分数排序(归并排序)

    考试结束了 全班同学的分数都出来了 老师需要对分数做一次排序 看看从高到低 分数的排列是怎样的 输入格式 第一行是一个n 表示班级同学的人数 1 lt n lt 500000 第二行开始有n个分数 0 lt 分数 lt 100 分数都是整数
  • 【C】PTA两个有序链表序列的合并

    课程 数据结构 陈越 何钦铭 本题要求实现一个函数 将两个链表表示的递增整数序列合并为一个非递减的整数序列 函数接口定义 List Merge List L1 List L2 其中List结构定义如下 typedef struct Node
  • 单调栈理解

    文章目录 单调栈 什么是单调栈 模拟实现一个单调栈 一些例题 视野总和 下一个最大元素 单调栈 什么是单调栈 从名字上就听的出来 单调栈中存放的数据应该是有序的 所以单调栈也分为单调递增栈和单调递减栈 单调递增栈 单调递增栈就是从栈底到栈顶
  • 算法题汇总

    NO1 打靶问题 打十次打靶 总分数为90分的情况有哪些 NO2 阶乘末尾0的个数 NO1 打靶问题 打十次打靶 总分数为90分的情况有哪些 个人感觉比较像一类排列组合递归回溯的解法 package com lzg flume interc
  • (十三):图

    1 图的基本介绍 1 1为什么要有图 前面我们学到了线性表和树 线性表局限于直接前驱和一个直接后继结点的关系 树也只能有一个直接前驱也就是父节点 当我们需要多对多关系时候 就需要图 1 2图的举例说明 图是一种数据结构 其中结点可以具有零个
  • 数据结构---填数字

    填数字 JAVA实现 C 实现 JAVA实现 public static int myFindABC int total 0 int sum 0 HashMap
  • DFS 刷题记录(laptop part)(2022.2.10)

    namespace matchstick my int isDividedby4 vector
  • 蛇形矩阵(Java)

    题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 输入 本题有多组数据 每组数据由一个正整数N组成 N不大于100 输出 对于每一组数据 输出一个N行的蛇形矩阵 两组输出之间不要额外的空行 矩阵三角中同一行的数字用一个空格分
  • 剑指Offer07:重建二叉树(Java)

    题目描述 解法思路 一开始想了半个小时都没想出来 幸好得到大佬的帮助 终于做出来 嘻嘻 采用递归的思想 不断拆分左右子树即可 首先我们通过前序遍历可以看到这个树的根节点是3 然后通过中序遍历 我们可以知道9是左子树 15 20 7是右子树
  • 数据结构和算法--链栈(C++实现)

    定义 栈是限定仅在表尾进行插入和删除操作的线性表 把允许插入和删除的一端称为栈顶 top 另一端称为栈底 bottom 不含任何数据元素的栈称为空栈 栈又称为后进先出 Last In First Out 的线性表 简称LIFO结构 incl
  • 基于C++的带权无向图的实现 (五)- 连通图和连通分量

    该系列文章是本人整理的有关带权无向图的数据结构和算法的分析与实现 若要查看源码可以访问我的github仓库 如有问题或者建议欢迎各位指出 目录 基于C 的带权无向图的实现 一 数据结构 基于C 的带权无向图的实现 二 遍历算法 基于C 的带
  • 基于C语言实现的文件压缩算法-哈夫曼编码

    哈夫曼编码 是一种数据压缩算法 通常用于无损数据压缩 该算法是由 David A Huffman在麻省理工学院就读理学博士 Doctor of Science 的时候发明的 这位大佬在1952年发表了相关的一篇论文A Method for
  • leetcode:93. 复原 IP 地址

    复原 IP 地址 中等 1 4K 相关企业 有效 IP 地址 正好由四个整数 每个整数位于 0 到 255 之间组成 且不能含有前导 0 整数之间用 分隔 例如 0 1 2 201 和 192 168 1 1 是 有效 IP 地址 但是 0
  • 深入理解左倾红黑树 | 京东物流技术团队

    平衡二叉搜索树 平衡二叉搜索树 Balanced Binary Search Tree 的每个节点的左右子树高度差不超过 1 它可以在 O logn 时间复杂度内完成插入 查找和删除操作 最早被提出的自平衡二叉搜索树是 AVL 树 AVL

随机推荐

  • 实战wxPython:049 - 实现一个登录窗口

    在很多GUI程序中 常常在应用启动开始的时候 需要一个用户登录对话框 在那里用户必须输入用户名和密码 如果密码和用户名正确 那么程序就继续加载 显示程序的主界面 下面我们将实现一个登录窗口 它具有以下功能 输入用户名及密码 登录 如果用户名
  • spring boot 2.2.6.RELEASE集成 eureka启动报错

    1 报错信息 org springframework cloud client discovery health DiscoveryCompositeHealthIndicator DiscoveryCompositeHealthIndic
  • MongoDB创建与删除集合(collection)

    一 创建集合 MongoDB的集合相当于关系型数据库的表 不过在创建集合时 执行指定集合名称与选项即可 无需指定类似RDBMS的列名 创建集合的语法为 db createCollection name option 其中 name是集合的名
  • 前端面试题--计算机网络

    文章目录 1 七层网络协议体系结构的理解 2 五层协议中各自对应的网络协议 3 ARP 协议的工作原理 4 IP 地址分类的理解 5 TCP 的主要特点 exclamation exclamation Transmission Contro
  • 推荐几个容易中的计算机EI源刊(基本百发百中)

    转自小木虫 作者 pcmagic 收录 2012 05 27 发布 2012 05 20 根据多年的经验 以下计算机EI源刊可以说是百发百中 只要有工作量 并不需要什么创新性均可录用 Journal of Computers JCP ISS
  • SDUTOJ KMP简单应用 【KMP】

    KMP简单应用 Time Limit 1000MS Memory limit 65536K 题目描述 给定两个字符串string1和string2 判断string2是否为string1的子串 输入 输入包含多组数据 每组测试数据包含两行
  • 单片机外设基本概念_嵌入式单片机教学(一)

    01 引言 哈喽各位 好久不见 看到标题应该知道 小白 又要 给大家 开启一系列的新教程了 肯定有人说我跨度还蛮大的 从ROS到神经网络又到嵌入式教学 其实这些都是小白在本科期间学到的一些知识啦 这边分享给大家 让不知道怎么做项目的小小白能
  • Ubuntu16.04及ROS Kinetic环境下安装使用RealSense SR300

    Ubuntu16 04及ROS Kinetic环境下安装使用RealSense SR300 1 准备条件 需要安装Ubuntu16 04及ROS Kinetic 2 安装驱动 安装realsense的驱动流程可以根据Github上的官方推荐
  • C#获取本机主机名—三种方式

    前提条件 引用名称空间 using System Net 建议 使用方式3 本人使用前2种方式都存在字符串自动截取的情况 方式1 Environment 获取本地计算机名 string machineName System Environm
  • 前端基础--主流浏览器及其内核

    IE trident Chrome webkit blink firefox Gecko Opera presto Safari webkit 内核主要分成两部分 渲染引擎 layout engineer或 Rendering Engine
  • Wrapper中的QueryWrapper常用ge,gt,lt,le具体含义

    英文缩写 英文全拼 含义 EQ equal 等于 NE not equal 不等于 GT greater than 大于 LT less than 小于 GE greater than or equal 大于等于 LE less than
  • centos7.3安装mysql5.7 && 解决 Access denied for user 'root'@'localhost' (using password: NO)

    开始查找自带的mariadb rpm qa grep mariadb 找到安装包并卸载 rpm e mariadb安装包 卸载完之后 我们就可以开始安装mysql5 7了 在这里可以找到我们需要的点击这里 鼠标放在最下面那个No thank
  • React仿写网易云音乐项目

    文章目录 一 项目功能说明 二 最终效果 三 文件目录结构说明 四 项目技术栈 五 核心技术 1 配置项目别名 craco craco 2 使用reset css进行 css 重置 3 使用CSS Sprites 精灵图 4 使用 memo
  • Java语言通过三种方法来实现队列

    队列 关于作者 作者介绍 博客主页 作者主页 简介 JAVA领域优质创作者 一名在校大三学生 在校期间参加各种省赛 国赛 斩获一系列荣誉 关注我 关注我学习资料 文档下载统统都有 每日定时更新文章 励志做一名JAVA资深程序猿 文章目录 队
  • 实现框架的类的方法为什么会在众多集成者中被调用

    以activities为例 实现了 author Tom Baeyens public interface Command
  • LVM磁盘扩容

    一 一块磁盘新增容量后加到lv里面去 一般在虚拟机里面出现这种情况多 这种方式需要重启 1 对新增磁盘空间进行分区 fdisk dev sda 注意 Selected partition 后要对分区的类型做改变 一定要选择t 8e 改变分区
  • Python .whl安装包简介和制作

    python 文章目录 python 前言 一 构建工程文件 二 封装Python包 三 制作python包为wheel文件 四 完整示例 小结 前言 Wheel和Egg都是python的打包格式 目的是支持不需要编译或制作的安装过程 实际
  • 脚本语言和编译语言的区别

    之前学了很多语言 例如c c Java c Python 突然想知道他们是怎么分类的 突然有疑问什么是编译语言 什么是脚本语言 查了一些资料 有了简单的初步了解 下面是总结的一部分内容 如果有什么问题敬请指正 什么是脚本语言 脚本语言是一种
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner
  • 求最大连续和的几种方法

    本文内容参考 算法竞赛入门经典第2版 220 223页 Q 给出一个长度为 n n n的序列 A 1 A