讨论 / 急求神牛查错! 杯具死~
itsvzc 2011-11-03 05:58:00
点我顶贴 收藏 删除
program game;

type arr=array[0..81] of longint;

var a:array[0..101,0..101] of longint;

f:array[-1..101,-1..101] of arr;

k:array[0..81] of arr;

ans,tmp:arr;

n,m,i,j,l:longint;

function add(a,b:arr):arr;

var i,len:integer; tmp:arr;

begin

fillchar(tmp,sizeof(tmp),0);

if a[0]>b[0] then len:=a[0]

else len:=b[0];

for i:=1 to len do

begin

inc(tmp[i],a[i]+b[i]);

inc(tmp[i+1],tmp[i] div 10);

tmp[i]:=tmp[i] mod 10;

end;

if tmp[len+1]>0 then tmp[0]:=len+1

else tmp[0]:=len;

exit(tmp);

end;

function multiply2(a:arr; b:longint):arr;

var i,len:integer; tmp:arr;

begin

fillchar(tmp,sizeof(tmp),0);

if b=0 then exit(tmp);

if a[0]=0 then exit(tmp);

for i:=1 to len do

begin

inc(tmp[i],a[i]*b);

inc(tmp[i+1],tmp[i] div 10);

tmp[i]:=tmp[i] mod 10;

end;

if tmp[len+1]>0 then tmp[0]:=len+1

else tmp[0]:=len;

exit(tmp);

end;

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

var i:longint;

begin

if a[0]>b[0] then exit(a);

if b[0]>a[0] then exit(b);

for i:=b[0] downto 1 do

begin

if a[i]>b[i] then exit(a);

if b[i]>a[i] then exit(b);

end;

exit(a);

end;

begin

readln(n,m);

for i:=1 to n do

for j:=1 to m do

read(a[i,j]);

k[0,0]:=1; k[0,1]:=1;

k[1,0]:=1; k[1,1]:=2;

for i:=2 to m do

k[i]:=multiply2(k[i-1],2);

for l:=1 to n do

begin

fillchar(tmp,sizeof(tmp),0);

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

for i:=0 to m do

for j:=0 to m-i do

begin

if (i=0) and (j=0) then continue;

f[i,j]:=max(add(f[i-1,j],multiply2(k[i+j],a[l,i])),

add(f[i,j+1],multiply2(k[i+j],a[l,m-j+1])));

end;

for i:=0 to m do

tmp:=max(tmp,f[i,m-i]);

ans:=add(ans,tmp);

end;

if ans[0]=0 then writeln(0);

for i:=ans[0] downto 1 do

write(ans[i]);

end.

查看更多回复
提交回复