洛谷1115 最大子段和

来源:互联网 发布:王千源事件 知乎 编辑:程序博客网 时间:2024/06/08 08:59

最大子段和

问题描述

给出一段序列,选出其中连续且非空的一段使得这段和最大。

分析

  从第一个一直往后加,记录最大值,加到和为负数时从0开始继续加。注意会有全是负数的情况最后判断即可。

时间复杂度

  O(n)

代码

const
  maxn=200000;
var
  a:array[0..maxn] of longint;
  n,ans,i,x:longint;


begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  for i:=1 to n do
    begin
      x:=x+a[i];
      if x>ans then ans:=x;
      if x<0 then x:=0;
    end;
  if ans=0 then
    begin
      ans:=-maxlongint;
      for i:=1 to n do
        if a[i]>ans then ans:=a[i];
    end;
  writeln(ans);
end.

0 0