洛谷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;
}