最大连续子序列和问题

题目描述

给定整数序列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;
}
经验分享 程序员 微信小程序 职场和发展