循环数组的最大子段和
问题描述:
N个整数组成循环序列,求这个序列的最大子段和。
例如:-2 11 -4 13 -5 -2 ANSWER: 20
解决:
解决这个问题需要有求解最大子段和的基础。
循环数组的最大子段和有两种情况: 一种是普通情况,另一种就是跨越一部分头和尾的情况。
对于第二种情况,如果拥有最大和的子段跨越了头和尾,那这时,中间的那一段就是一个 “最小子段和” ,因为序列的总和是一定的。
那么,怎么知道这个最小子段在哪里呢,我们只要把所有的数都取负,再求一次最大子段和就可以了。
那么也就是说,循环数组的最大子段和,就是求了两次最大子段和。
#include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; ll a[50005],b[50005]; ll mxsub(ll a[],int n) {ll sum=-999999999,b=0;for(int i=0;i<n;i++){if(b>0) b+=a[i];else b=a[i];if(b>sum) sum=b;}return sum; } int main() {int n; while(scanf("%d",&n)!=EOF){ll s=0;for(int i=0;i<n;i++){scanf("%lld",&a[i]); //输入序列s+=a[i]; // 求整个序列的和b[i] = -a[i]; // 把整个序列取负放在另一个序列里}ll ans=mxsub(a,n); // 普通情况下的最大子段和ll ans2=s + mxsub(b,n); // 跨越头和尾的ans = max(ans,ans2); // 两者取大printf("%lld\n",ans);}return 0; }
如果有什么不对的地方,还请各位大神批评指正~
转载于:https://www.cnblogs.com/ember/p/4716489.html
循环数组的最大子段和相关推荐
- 1050 循环数组最大子段和
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 【51nod - 1050】循环数组最大子段和(dp)
题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...
- 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...
- 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】
1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...
- 循环数组最大字段和(51Nod-1050)
题目 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a ...
- [算法] 求环形数组中和值最大子段
对于非环形数组,求解和值最大子段的方法见之前一遍文章: 对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍: 需要注意子段长度不可以超过整个数组长度: 1 #! ...
- 【C++算法与数据结构学习笔记------用循环数组实现队列】
照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...
- 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法
题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...
- 约瑟夫问题的学习(基于循环链表)以及基于循环数组
这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...
最新文章
- HTML form 标签的 enctype 属性
- 使用cookie解决微信不能存储localStorage的问题
- linux 搭建.net运行环境,.net core运行环境搭建 linux + windows
- OpenCV 距离变换的笔记
- 基于计算机的控制系统,基于计算机的机械控制系统实现方式研究.pdf
- Xamarin.Forms 5.0 来了
- mysql optimizer组件_MySQL Optimizer
- 马斯克:如果我不担任CEO 特斯拉就会完蛋
- linux双系统启动项grub,grub双系统启动顺序更改
- 实现前后台数据交互(上传/回传单个JSON数据和上传/回传JSON数组)
- Linux查看和剔除当前登录用户-转
- 饿了么是视障者非常喜欢的APP,你们要加油哦!
- 课程设计matlab仿真,MATLAB与仿真系统课程设计报告
- 一文了解新营销,数字经济时代如何以个人为中心重建品牌?
- clonezilla使用_如何使用Clonezilla备份和恢复已死或即将死去的系统磁盘
- 如何调试delphi的Access violation at address错误
- LTE(4G) ATTACH流程
- 诗词创作[3] 问春
- pytorch的cuda环境搭建(GPU版本安装)
- nohup ——Linux后台运行命令