給出一段序列,選出其中連續且非空的一段使得這段和最大。
輸入格式:
輸入檔案maxsum1.in的第一行是乙個正整數n,表示了序列的長度。
第2行包含n個絕對值不大於10000的整數a[i],描述了這段序列。
輸出格式:
輸入檔案maxsum1.out僅包括1個正整數,為最大的子段和是多少。
輸入樣例#1:
7輸出樣例#1:2 -4 3 -1 2 -4 3
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...