LJY Codes

代码改变世界!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

经典例题(二)——最大子段和

Posted on 2017-11-04 10:16  hzzxLJY  阅读(381)  评论(0编辑  收藏  举报

最大字段和

【题目描述】给出一段序列,选出其中连续且非空的一段使得这段和最大。

【输入格式】输入文件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.