最大連續和(題解)

2022-05-05 18:33:08 字數 1305 閱讀 2641

題目描述:

給出乙個長度為n 的序列a1,a2,...,an,求最大連續和。換句話說,要求找到1<=i<=j<=n,使得ai+ai+1+...+aj 盡量大。

輸入格式:

第一行輸入n(1<=n<=50000)。

接下來1 行輸入序列的n 個元素,第i+1 行為ai(|ai|<=10000)。

輸出格式:

輸出乙個數表示最大連續和。

樣例輸入輸出:

42 -1 3 -2

資料範圍:

30%的資料n<=100;

60%的資料n<=10000;

100%的資料n<=50000。

這道題有很多種方法,當然得的分也不盡相同:

#include #include 

#include

#include

#include

#include

#include

using

namespace

std;

int a[50005],pre[50005

];typedef

long

long

ll;ll ans;

intmain()

for(int i = 1 ; i <= n ; i++)

}printf(

"%lld

",ans);

return0;

}

這裡是用總體字首和減去前位字首和來計算和,但是這種方法是n^2的複雜度,只能得60分,雖然字首和的方法很高大上,卻還有一種方法更犇。

時間複雜度為o(n)的方法:

對於每乙個數,將這個數與前幾個數的和和下乙個數進行比較,如果前者大的話,就取前面的那個,否則就從下乙個數開始。這樣保證每次加的數的和都是最大的(如果不是最大的,就從下乙個數開始重新計算了),所以,特別神奇吧。

**:

#include #include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=50050

;int n,ans=-2147483647

,dp[maxn],a[maxn];

intmain()

printf(

"%d\n

",ans);

return0;

}

最大連續和

這個問題對我來說還挺難的,當初做dp時水過去了,但沒徹底理解,這次打算好好分析一下,爭取徹底搞懂。首先,像 1 1 2 2 3 3 4 4 5 5這樣的數列,想要找連續最大和,可以有很多種方法,從最慢的列舉o n 3 到最快的動態規劃o n 毫無疑問,我們要選擇複雜度低的演算法。所以我這裡就只分析兩...

最大連續和

求陣列中數的最大連續和,如 1,1,1,1,1 最大連續和為3 一 動態規劃 當我們從頭到尾遍歷這個陣列的時候,對於陣列裡的乙個整數,它有幾種選擇呢?它只有兩種選擇 1 加入之前的subarray 2.自己另起乙個subarray。那什麼時候會出現這兩種情況呢?設狀態為f j 表示以s j 結尾的最...

最大連續和

給出乙個長度為n的序列a1,a2,an,求最大連續和 使用列舉 時間複雜度o n 3 best a 1 初始最大值 for int i 1 i n i 設si a1 a2 ai,則ai ai 1 aj sj si 1 連續子串行的和等於兩個字首之差 時間複雜度o n 2 s 0 0 for int ...