luogu P1115 最大子段和

2021-08-21 15:54:20 字數 656 閱讀 5149

最大子段和是個比較經典的演算法題,解法很多。

這裡給出乙個o(n)的解法,自己想的比較直觀:

設max_sum為最大累計和 cur_sum為當前累計和,要想獲得最大的連續和,顯然要盡可能保持cur_sum為正數,

試想如果為負,那麼接下來加上什麼數字都是減少的。

對此時處理的位置(不妨設為num[i]),如果cur_sum為正數且cur_sum+num[i] > 0 ,

那麼我們更新cur_sum = cur_sum+num[i] ,否則(其他一切情況 包括cur_sum<0) cur_sum=num[i]

然後檢查此時cur_sum 是否大於max_sum來更新即可。

ps: 為什麼這個思路是正確的? 因為正數累計下去有可能增大,而負數絕無可能。

pss: 最後給出乙個比較正統的dp方法(其實跟我的一樣,但是更凝練)

f[i] = max( f[i-1]+num[i], num[i] )

#include 

#include

#include

using

namespace

std;

int n,m,ans=0;

int main()

cout

0;}

洛谷1115 最大子段和

最大子段和 問題描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。分析 從第乙個一直往後加,記錄最大值,加到和為負數時從0開始繼續加。注意會有全是負數的情況最後判斷即可。時間複雜度 o n const maxn 200000 vara array 0.maxn of longint n,a...

P1115 最大子段和

給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入格式 輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列。輸出格式 輸入檔案maxsum1.out僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。輸...

P1115 最大子段和

給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入格式 輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列。輸出格式 輸入檔案maxsum1.out僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。輸...