讨论 / 怎么是环,搞得要死
luyifan 2009-08-02 05:27:00
点我顶贴 收藏 删除
var

n,i,j,k:longint;

a:array[1..100]of longint;

sum:array[0..100]of longint;

f,g:array[0..100,1..100]of int64;

function min(a,b:int64):int64;

begin

if a<b

then exit(a)

else exit(b);

end;

function max(a,b:int64):int64;

begin

if a<b

then exit(b)

else exit(a);

end;

begin

fillchar(f,sizeof(f),0);

filldword(g,sizeof(g)div 4,maxlongint);

readln(n);

sum[0]:=0;

for i:=1 to n do

begin read(a[i]);

sum[i]:=sum[i-1]+a[i];

end;

for i:=1 to n-1 do

begin

f[1,i]:=a[i]+a[i+1];

g[1,i]:=a[i]+a[i+1];

end;

for i:=1 to n do

begin

f[0,i]:=0;

g[0,i]:=0;

end;

for i:=2 to n-1 do

for j:=1 to n-i do

for k:=0 to i-1 do

begin

f[i,j]:=max(f[k,j]+f[i-k-1,j+k+1]+sum[j+i]-sum[j-1],f[i,j]);

g[i,j]:=min(g[k,j]+g[i-k-1,j+k+1]+sum[j+i]-sum[j-1],g[i,j]);

end;

writeln(g[n-1,1]);

writeln(f[n-1,1]);

end.

从50到100

var

n,i,j,k:longint;

max1,min1:int64;

a:array[1..200]of longint;

sum:array[0..200]of longint;

f,g:array[0..200,1..200]of int64;

function min(a,b:int64):int64;

begin

if a<b

then exit(a)

else exit(b);

end;

function max(a,b:int64):int64;

begin

if a<b

then exit(b)

else exit(a);

end;

begin

fillchar(f,sizeof(f),0);

filldword(g,sizeof(g)div 4,maxlongint);

readln(n);

sum[0]:=0;

for i:=1 to n do

begin read(a[i]);

a[i+n]:=a[i];

sum[i]:=sum[i-1]+a[i];

end;

for i:=n+1 to 2*n do

sum[i]:=sum[i-1]+a[i];

for i:=1 to 2*n-1 do

begin

f[1,i]:=a[i]+a[i+1];

g[1,i]:=a[i]+a[i+1];

end;

for i:=1 to 2*n do

begin

f[0,i]:=0;

g[0,i]:=0;

end;

for i:=2 to n-1 do

for j:=1 to 2*n-i do

for k:=0 to i-1 do

begin

f[i,j]:=max(f[k,j]+f[i-k-1,j+k+1]+sum[j+i]-sum[j-1],f[i,j]);

g[i,j]:=min(g[k,j]+g[i-k-1,j+k+1]+sum[j+i]-sum[j-1],g[i,j]);

end;

max1:=0;min1:=maxlongint;

for i:=1 to n do

begin

if f[n-1,i]>max1

then max1:=f[n-1,i];

if g[n-1,i]<min1

then min1:=g[n-1,i];

end;

writeln(min1);

writeln(max1);

end.

查看更多回复
提交回复