1. 程式人生 > >1007 Maximum Subsequence Sum - 最大連續子序

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]);
}