1007 Maximum Subsequence Sum - 最大连续子序

思路:

原则是:用now表示当前的判断,在把多个元素加和的时候,若加到a[i]的时候小于0,那么舍去a[i],继续向后判断,设ans=-1记录最大值(设为-1的原因是要处理0开头的情况)

若sum==0那么我们不要(题上要求i,j最小),但如果第1个数是0那么就要

用tleft表示临时的左节点,当ans>now的时候更新left=tleft,right=a[i]

最后判断一下全负的情况

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
const int N=10005;
int a[N];
int main(){
    int k;
    scanf("%d",&k);
    for(int i=1;i<=k;i++){
        scanf("%d",&a[i]);
    }
    int ans=-1,now=0,tleft=1,left,right;
    for(int i=1;i<=k;i++){
        now+=a[i];
        if(now>ans){
            ans=now;
            left=tleft;
            right=i;
        }
        else if(now<0){
            now=0;
            tleft=i+1;
        }
    }
    if(ans<0){left=1;right=k;ans=0;}
    printf("%d %d %d\n",ans,a[left],a[right]);
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/83050914