51nod 1050 循环数组最大子段和
2016-06-25 19:02
197 查看
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050
题目:
N个整数组成的循环序列a[1],a[2],a[3],…,a
,求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a
,a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
有两种可能,第一种为正常从[1 - n]序列中的最大子字段和;第二种为数组的total_sum - ([1-n]序列中的最短序列和)
最后结果为 max { 第一种, 第二种}。
题目:
N个整数组成的循环序列a[1],a[2],a[3],…,a
,求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a
,a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
有两种可能,第一种为正常从[1 - n]序列中的最大子字段和;第二种为数组的total_sum - ([1-n]序列中的最短序列和)
最后结果为 max { 第一种, 第二种}。
#include <iostream> #include<bits/stdc++.h> #define N 55000 #define LL long long using namespace std; int a ,b ; int main() { int n; scanf("%d",&n); LL sum=0,sum1=0,sum2=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; b[i]=-a[i]; } LL ans=a[0]; for(int i=0;i<n;i++) { sum1+=a[i]; sum2+=b[i]; if(sum1<0) sum1=0; if(sum2<0) sum2=0; ans=max(ans,sum1); ans=max(ans,sum+sum2); } cout<<ans<<endl; }
相关文章推荐
- StudyJams-第06课_篮球记分板
- 作业1
- c++指针
- windows下安装php笔记
- js对字符串的操作和对数组的管理
- 伴随 XP 系统消逝的,还有那张蓝天白云草原的经典壁纸
- 《构建之法----现代软件工程》书评
- 《OD学hadoop》mac下使用VMware Fusion安装centos
- 动态数据竞争验证和检测方法
- 数据库三大范式,我的理解
- 6月25日下午小结
- 国外程序员经常用的二十八个学习网站
- MD5加密相关
- 互联网信息搜索服务管理规定
- 正则表达式匹配
- TreeMap的实现
- cocos lua -字符串匹配规则。
- 遍历文件夹
- BZOJ2527: [Poi2011]Meteors
- hadoop DataNode节点超时