题目描述:
君不知,打靶大牛goleenuoer可喜欢打水漂了,他的靶子可以打到河面上的任何一条鱼,可是他的水漂打得实在是烂,无论怎么打那石子只会在河面上跳跃两次就“扑通”了.这天他又来打了.这条宽w米,每隔一米都会有一条鱼,每条鱼都有它的美观值.他想知道如何打才能得到两条鱼之间最大的美观值总和.刚接触OI的他想请您来解答,您能帮助他吗???
输入格式
输入文件包含n+1个整数,第一行为一个整数n(n<=10000).从第二行工n个数,第i个整数表示第i条鱼的美观值范(围为-500..500).当所有整数都为负数时输出0.
输出格式
输出文件包含两行,第一行为石子的起点和落点,用空格隔开.第二行为一个整数表示所得到的两条鱼之间美观值总和.
样例输入
10
5 8 -5 -10 5 1 -3 2 4 2
样例输出
0 2
13
最大子段和
var
x:array[0..10000]of longint;
dp:array[0..10000,0..1]of longint;
i,n,max,t:longint;
begin
readln(n);
for i:=1 to n do
read(x[i]);
dp[1,0]:=1; dp[1,1]:=x[1];
for i:=2 to n do
if dp[i-1,1]+x[i]>x[i]
then begin dp[i,1]:=dp[i-1,1]+x[i]; dp[i,0]:=dp[i-1,0]; end
else begin dp[i,1]:=x[i]; dp[i,0]:=i; end;
max:=0;
for i:=1 to n do
if dp[i,1]>max
then begin max:=dp[i,1]; t:=i; end;
if max=0
then writeln(0)
else
begin
writeln(dp[t,0],' ',t);
writeln(dp[t,1]);
end;
end.
枚举前缀和
var
s,x:array[0..10000]of longint;
i,j,ans,a,b,n:longint;
begin
readln(n);
for i:=1 to n do
begin
read(x[i]);
s[i]:=s[i-1]+x[i];
end;
ans:=0; a:=0; b:=0;
for i:=1 to n do
for j:=i+1 to n do
if s[j]-s[i-1]>ans
then begin ans:=s[j]-s[i-1]; a:=i; b:=j; end;
if ans=0
then writeln(0)
else
begin
writeln(a,' ',b);
writeln(ans);
end;
end.