type hycd=array[0..35]of longint; var //NOIP2007 f:array[0..80,0..80]of hycd; a:array[1..80,1..80]of longint; g:array[-1..80]of hycd; x,y,h,ans:hycd; n,m,i,j,k:longint; function mmax(a,b:longint):longint; begin if a>b then exit(a) else exit(b) end; procedure times(var a,b,c:hycd); var i,j,k:longint; begin fillchar(c,sizeof(c),0); for i:=1 to a[0] do for j:=1 to b[0] do begin inc(c[i+j-1],a[i]*b[j]); inc(c[i+j],c[i+j-1] div 10); c[i+j-1]:=c[i+j-1] mod 10; end; k:=a[0]+b[0]; while c[k]=0 do dec(k);c[0]:=k end; procedure minus(var a,b,c:hycd); var i,j,k:longint; begin k:=mmax(a[0],b[0]); fillchar(c,sizeof(c),0); for i:=1 to k do begin inc(c[i],a[i]+b[i]); inc(c[i+1],c[i] div 10); c[i]:=c[i] mod 10; end; while c[k+1]>0 do begin inc(k); inc(c[k+1],c[k] div 10); c[k]:=c[k] mod 10 end; c[0]:=k end; function maxd(var a,b:hycd):hycd; var i,j:longint; begin if a[0]>b[0] then exit(a); if a[0]b[i] then exit(a); if a[i]0 do begin inc(a[0]);a[a[0]]:=k mod 10;k:=k div 10 end; end; begin assign(input,'game.in'); reset(input); assign(output,'game.out'); rewrite(output); ans[0]:=1; readln(n,m); for i:=1 to n do for j:=1 to m do read(a[i,j]); g[0,0]:=1;g[0,1]:=1; g[-1,0]:=1;g[-1,1]:=2; for i:=1 to m do times(g[i-1],g[-1],g[i]); for k:=1 to n do begin {fillchar(f,sizeof(f),0); } for i:=m downto 1 do for j:=i to m do begin if i=j then begin change(g[-1],a[k,i]); times(g[m],g[-1],f[i,j]) end else begin change(g[-1],a[k,i]); times(g[m-j+i],g[-1],h); minus(h,f[i+1,j],x); change(g[-1],a[k,j]); times(g[m-j+i],g[-1],h); minus(h,f[i,j-1],y); f[i,j]:=maxd(x,y); { f[i,j]:=max(f[i+1,j]+a[k,i]*g[m-j+i],f[i,j-1]+a[k,j]*g[m-j+i]);} end; end; g[-1]:=ans; minus(g[-1],f[1,m],ans); end; for i:=ans[0] downto 1 do write(ans[i]); writeln; close(input); close(output); end.