[POJ2479]Maximum sum

【问题描述】

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
 
7fd50e9b5dd1ab506c068c7a.jpg
Your task is to calculate d(A).

 

【解题报告】

求一个整数串的两个不相交字串的和的最大值。数据范围30组N<=50000。

用O(N2)肯定超时 被虐了一上午才写出O(N)。

 1 program poj2479;
2 var
3 n,ans,t,k,i:longint;
4 lmaxn,rmaxn,lmax,rmax,a:array[0..50001]of longint;
5
6 function max(a,b:longint):longint;
7 begin
8 if a>b then exit(a);
9 exit(b);
10 end;
11
12 procedure main;
13 begin
14 readln(t);
15 for k:=1 to t do
16 begin
17 read(n);
18 for i:=1 to n do read(a[i]);
19 lmax[1]:=a[1];
20 lmaxn[1]:=a[1];
21 for i:=2 to n do lmax[i]:=max(lmax[i-1]+a[i],a[i]);
22 for i:=2 to n do lmaxn[i]:=max(lmaxn[i-1],lmax[i]);
23 rmax[n]:=a[n];
24 rmaxn[n]:=a[n];
25 for i:=n-1 downto 1 do rmax[i]:=max(rmax[i+1]+a[i],a[i]);
26 for i:=n-1 downto 1 do rmaxn[i]:=max(rmaxn[i+1],rmax[i]);
27 ans:=-maxlongint;
28 for i:=1 to n-1 do ans:=max(ans,lmaxn[i]+rmaxn[i+1]);
29 writeln(ans);
30 end;
31 end;
32
33 begin
34 main;
35 end.
36

转载于:https://www.cnblogs.com/wwzhwdwd/archive/2011/08/27/2155570.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值