洛谷-最大子段和-動態規劃

題目描述

給出一段序列,選出其中連續且非空的一段使得這段和最大。數組

輸入輸出格式

輸入格式:

輸入文件maxsum1.in的第一行是一個正整數N,表示了序列的長度。spa

第2行包含N個絕對值不大於10000的整數A[i],描述了這段序列。code

輸出格式:

輸入文件maxsum1.out僅包括1個整數,爲最大的子段和是多少。子段的最小長度爲1。blog

輸入輸出樣例

輸入樣例#1:
7
2 -4 3 -1 2 -4 3
輸出樣例#1:
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 }
相關文章
相關標籤/搜索