最大字段和
【题目描述】给出一段序列,选出其中连续且非空的一段使得这段和最大。
【输入格式】输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度。
第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。
【输出格式】输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。
【输入样例】
7 2 -4 3 -1 2 -4 3
【输出样例】
4
【数据规模与约定】
对于40%的数据,有N ≤ 2000。
对于100%的数据,有N ≤ 200000。
【解题思路】
方法一:动态规划处理。
状态转移方程:
f[i]:=max(a[i],f[i-1]+a[i]) //要么舍弃,要么累加
方法二:类似贪心的算法。如果这个数小于零则不加上去
参考程序:
var n,i,s,ans,a:longint; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; begin readln(n); s:=0; ans:=-maxlongint; for i:=1 to n do begin read(a); s:=s+a; ans:=max(ans,s); if s<0 then s:=0; end; writeln(ans); end.