洛谷P1115最大子段和

洛谷1115 最大子段和

本題地址: http://www.luogu.org/problem/show?pid=1115

題目描述
給出一段序列,選出其中連續且非空的一段使得這段和最大。
輸入輸出格式
輸入格式:
輸入文件maxsum1.in的第一行是一個正整數N,表示了序列的長度。
第2行包含N個絕對值不大於10000的整數A[i],描述了這段序列。
輸出格式:
輸入文件maxsum1.out僅包括1個正整數,爲最大的子段和是多少。

輸入輸出樣例
輸入樣例#1:
7
2 -4 3 -1 2 -4 3
輸出樣例#1:
4

說明
【樣例說明】2 -4 3 -1 2 -4 3
【數據規模與約定】
對於40%的數據,有N ≤ 2000。
對於100%的數據,有N ≤ 200000。

一看,這不是簡單地遞推嘛!
從頭線性掃一遍找最優即可
但2次80分之後我仔細分析了一下, 如果全是負數,就會出現輸出0的錯誤(當成不選)。
於是加上特判就AC了

#include<iostream>
using namespace std;
const int N=200005;
int a[N];
int main()
{
    int n,i,ans=0;
    bool pd=false;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]>0)
            pd=true;
    }
    if(pd==false)//特判,全是負數的情況
    {
        ans=a[1];
        for(i=2;i<=n;i++)
            if(a[i]>ans)
                ans=a[i];
        cout<<ans;
        return 0;
    }
    for(i=1;i<=n;i++)//正常情況
    {
        a[i]+=max(0,a[i-1]);
        ans=max(ans,a[i]);
    }
    cout<<ans;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章