回 帖 发 新 帖 刷新版面

主题:帮忙啊!!!+分

有一个N项的数列a1, a2 ... aN (|ai| <=10000, 1 <= i <= N)。你的任务是求该数列的两个不相交子序列的最大和。 

Input 

第一行是一个整数N(2 <= N <= 100000),表示数列的项数。第二行有n个整数,用空格分隔,第i个整数Ai(|Ai| <=10000)是第i位数。

Output 

包括一行,这一行只包含一个整数,就是该数列的两个不相交子序列的最大和。

Sample Input 


5
-5 9 -5 11 20


Sample Output 


40

Hint 

对于30%的数据,保证有n <= 80; 
对于70%的数据,保证有n <= 10000; 
对于全部的数据,保证有n <= 100000。



下面是我的程序:
const
 maxin=10005;
var
 i,j,n,t,maxx:integer;
 a:array[0..1000]of integer;
 f,fm:array[0..1000,0..1000]of integer;
function max(a,b,c:integer):integer;
 begin
  max:=a;
  if b>max then max:=b;
  if c>max then max:=c;
 end;

function maxf(i,j:integer):integer;
var
 max1,max2,ii,jj:integer;
 begin
 if fm[i,j]<>-maxin then begin maxf:=fm[i,j];exit;end;
 maxf:=max(f[i,j],maxf(i,j-1),maxf(i+1,j));
 fm[i,j]:=maxf;
 end;
begin

  readln(n);
  for i:=1 to n do
   read(a[i]);
  for i:=1 to n do
  for j:=1 to n do
  begin
   f[i,j]:=0;
   fm[i,j]:=-maxin;
  end;

   for i:=1 to n do begin f[i,i]:=a[i];fm[i,i]:=a[i];end;
  for i:=1 to n-1 do
    for j:=i+1 to n do
     f[i,j]:=f[i,j-1]+a[j];

    maxx:=maxf(1,n);
    for i:=1 to n-1 do
    if maxx<fm[1,i]+fm[i+1,n] then maxx:=fm[1,i]+fm[i+1,n];
    writeln(maxx);
    close(output);
end.

以样列输入时是对的。
问题是当我把
a:array[0..1000]of integer;
 f,fm:array[0..1000,0..1000]of integer;
改为
 a:array[0..9000]of integer;
 f,fm:array[0..9000,0..9000]of integer;
结果变为 60 ?
为啥??

另外 求一个可以过n=100000的代码

回复列表 (共2个回复)

沙发

我可没那么多的时间做

板凳


先给分,再告诉你

我来回复

您尚未登录,请登录后再回复。点此登录或注册