洛谷1115 最大子段和 解題報告

2022-05-06 05:39:07 字數 1239 閱讀 1453

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

輸入格式:

輸入檔案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。

動態規劃

根據題目中n<=200000的範圍限制,要想解決此題,必須尋找時間複雜度為o(n)的有效演算法。容易想到採用動態規劃來解決該問題。

用a[i]儲存序列。

定義f[i]:以a[i]為連續子串行右邊界(連續子串行的最右乙個元素)的最大連續子串行的和。

容易得出方程:f[i]:=max    (1<=i<=n)

初始:f[1]=a[1];

目標:max    (1<=i<=n)

下面附上**。

program zdzdh;    

var      

a,ans:array[1..200000] of int64;      

n,i:longint;      

max:int64;      

begin      

readln(n);      

read(a[1]);      

ans[1]:=a[1];      

for i:=2 to n do      

begin      

read(a[i]);      

if ans[i-1]<0 then ans[i]:=a[i] else ans[i]:=ans[i-1]+a[i];      

end;      

max:=-maxlongint;      

for i:=1 to n do      

if ans[i]>max then max:=ans[i];    

writeln(max);      

end.   

洛谷最大子樹和解題報告

不知為什麼我做這道題莫名吃力,最後還是看了題解,大概是搜尋沒有學好的緣故吧。最近總是在學習一些其他的東西,現在看來還是打好基礎為妙。這道題其實不難,開三個陣列pre,next,last儲存邊與點的關係。不妨從1開始搜尋,找每條與它相鄰的邊,依次算出他們的最大子樹和,若大於零便累計起來。最後加上1節點...

洛谷1115 最大子段和

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

洛谷 1115 最大子段和

題解 經典的最大子段和問題。如果當前sum大於等於0,就累加上當前的數 當前的sum小於0,就把sum變為0,即之前的那些都不取,因為它們對答案的貢獻是負的。掃一遍即可。1 include2 include3 include4 define ll long long 5 define rg regi...