【培训试题】最大连续子序列的和 |
Time Limit:10000MS Memory Limit:65536K
Total Submit:877 Accepted:427
Case Time Limit:1000MS
Description
求最大连续子序列的和
Input
第一行输入n(n<=100000),第二行为n个以空格分开的整数;
Output
该序列中最大的连续子序列的和(不超过longint)
Sample Input
6
1 2 -5 6 7 8
Sample Output
21
【解析】
这题可以说非常基础了,思路是这样。
设f[i]表示到i为止的最大子序列和,那么
if f[i-1]+a[i]>0
f[i]:=f[i-1]+a[i]
f[i]的初始值为0。
注意的地方是,本题的数据来看,还要求序列非空。意思就是如果是一个全部为负数的序列,不能输出0,要找到原序列中最大的那个负数输出。
代码如下。
var f,a:array[0..100000] of longint; n,i,k,max:longint; begin //assign(input,'1079.in');reset(input); //assign(output,'ans.out');rewrite(output); readln(n); fillchar(f,sizeof(f),0); for i:=1 to n do read(a[i]); for i:=1 to n do if f[i-1]+a[i]>0 then f[i]:=f[i-1]+a[i] else f[i]:=0; max:=f[1]; for i:=1 to n do if f[i]>max then max:=f[i]; if max=0 then begin max:=a[1]; for i:=1 to n do if a[i]>max then max:=a[i]; end; writeln(max); //close(input);close(output); end.