最大连续子序列和问题
题目描述
给定整数序列A1,A2,…,An,对其所有连续子序列求和,寻找累加和最大的序列。如果所有的整数都是负的,那么最大连续子序列的和为0。
输入格式
输入包括多组测试数据,每组测试数据一行,每行第一个为正整数n(0 < n <= 100000),表示序列长度,紧跟着n个整数,Ai (-1001<Ai < 1001),表示序列每个元素,各个整数之间用空格隔开。
输出格式
针对每组测试数据,输出最大连续子序列的和,以及该最大连续子序列的起止位置。当最大连续子序列的长度为0时,序列的起止位置都输出为-1。如果有多个连续子序列的值为最大值,输出第一个连续子序列。 多组输出用换行隔开
输入样例 复制
6 -2 11 -4 13 -5 2 1 -1
输出样例 复制
20 1 3 0 -1 -1
#include <iostream> #include<cmath> #define ll long long using namespace std; const int Max=1e5+5; int a[Max]; int main() { int n; while(cin>>n){ for(int i=0;i<n;i++)scanf("%d",&a[i]); int maxsum,maxhere; maxsum=maxhere=a[0]; int beg=0,end=0,newbeg=0; for(int i=1;i<n;i++){ if(maxhere<=0){ //目前sum<=0时换新开头 maxhere=a[i]; newbeg=i; } else { maxhere+=a[i]; } if(maxhere>maxsum){ maxsum=maxhere;//记录最大值以及首尾下标 beg=newbeg; end=i; } } if(maxsum<=0)printf("0 -1 -1 "); else printf("%d %d %d ",maxsum,beg,end); } return 0; }
下一篇:
【新员工座位安排系统】