給出一段序列,選出其中連續且非空的一段使得這段和最大。數組
輸入文件maxsum1.in的第一行是一個正整數N,表示了序列的長度。spa
第2行包含N個絕對值不大於10000的整數A[i],描述了這段序列。code
輸出格式:輸入文件maxsum1.out僅包括1個整數,爲最大的子段和是多少。子段的最小長度爲1。blog
7 2 -4 3 -1 2 -4 3
4
【樣例說明】2 -4 3 -1 2 -4 3io
【數據規模與約定】class
對於40%的數據,有N ≤ 2000。方法
對於100%的數據,有N ≤ 200000。數據
思路:在這裏我只講一個解決方法,就是動態規劃(那些暴力枚舉什麼的我就不說了)。di
咱們掃面一個數組,找到一個元素a,存入max中,當咱們發現他的下一個元素b和a之和是要比0小,那麼咱們就認爲b是「沒有潛力的」,什麼意思呢,就是我加上b就變小了,還不如不加,可是咱們又不能跳過b去加b後面的元素c,因此遇到這種狀況咱們就判斷這個子段失敗,max從新標記爲0。動態規劃
若是加上下一個元素b大於0,就能夠判斷咱們目前全局的答案ans是比這個和要大仍是小,若是大更新一下ans的值,不然就不變。
最後輸出ans就得了。
代碼以下:
1 #include <stdio.h> 2 int COMPAREMAX(int a,int b) 3 { 4 return a>b?a:b; 5 } 6 int main() 7 { 8 int a[200002]; 9 int n,i; 10 scanf("%d",&n); 11 for(i=0;i<n;i++) 12 { 13 scanf("%d",&a[i]); 14 } 15 int max=0,ans=0; 16 for(i=0;i<n;i++) 17 { 18 if(max+a[i]<0) 19 { 20 max=0; 21 } 22 else 23 { 24 ans=COMPAREMAX(ans,max+=a[i]); 25 } 26 } 27 if(ans==0)//有負數 28 { 29 ans=a[0]; 30 for(i=1;i<n;i++) 31 { 32 if(a[i]>ans) 33 { 34 ans=a[i]; 35 } 36 } 37 } 38 printf("%d\n",ans); 39 return 0; 40 }