问题描述:

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

循环数组的最大子段和相关推荐

  1. 1050 循环数组最大子段和

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  2. 【51nod - 1050】循环数组最大子段和(dp)

    题干: N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1], ...

  3. 51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+ ...

  4. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  5. 循环数组最大字段和(51Nod-1050)

    题目 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a ...

  6. [算法] 求环形数组中和值最大子段

    对于非环形数组,求解和值最大子段的方法见之前一遍文章: 对于环形数组,需要考虑最大和值子段越过首尾边界的情况,解决方法比较简单,即将数组处理两遍: 需要注意子段长度不可以超过整个数组长度: 1 #! ...

  7. 【C++算法与数据结构学习笔记------用循环数组实现队列】

    照王晓东<数据结构>(C++语言版)上打的,以备留用. 1 #include <iostream> 2 using namespace std; 3 template<t ...

  8. 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法

    题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...

  9. 约瑟夫问题的学习(基于循环链表)以及基于循环数组

    这是17世纪法国数学家加斯帕在<数目中的游戏问题>讲的一个问题:15个教徒和15个非教徒在海上遇险,必须将一般的人投入海中,其他的人才能幸免于难.与实现各一个办法:30个人围成一个圈,从第 ...

最新文章

  1. HTML form 标签的 enctype 属性
  2. 使用cookie解决微信不能存储localStorage的问题
  3. linux 搭建.net运行环境,.net core运行环境搭建 linux + windows
  4. OpenCV 距离变换的笔记
  5. 基于计算机的控制系统,基于计算机的机械控制系统实现方式研究.pdf
  6. Xamarin.Forms 5.0 来了
  7. mysql optimizer组件_MySQL Optimizer
  8. 马斯克:如果我不担任CEO 特斯拉就会完蛋
  9. linux双系统启动项grub,grub双系统启动顺序更改
  10. 实现前后台数据交互(上传/回传单个JSON数据和上传/回传JSON数组)
  11. Linux查看和剔除当前登录用户-转
  12. 饿了么是视障者非常喜欢的APP,你们要加油哦!
  13. 课程设计matlab仿真,MATLAB与仿真系统课程设计报告
  14. 一文了解新营销,数字经济时代如何以个人为中心重建品牌?
  15. clonezilla使用_如何使用Clonezilla备份和恢复已死或即将死去的系统磁盘
  16. 如何调试delphi的Access violation at address错误
  17. LTE(4G) ATTACH流程
  18. 诗词创作[3] 问春
  19. pytorch的cuda环境搭建(GPU版本安装)
  20. nohup ——Linux后台运行命令

热门文章

  1. MSMQ消息队列演示程序
  2. Spring bean的生命流程
  3. KVM虚拟化环境搭建
  4. Ubuntu 11.10 安装Adobe Air 和卸载Air中的软件
  5. onMeasure模式
  6. centos安装g++
  7. Imagine,is real crazy!
  8. panel内嵌程序窗体
  9. Unity中sharedMaterials 和 materials
  10. Shell脚本笔记(三)shell中的数学计算