主题:帮忙啊!!!+分
有一个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的代码
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的代码