程:
program rq94;
const fx:array [1..3] of shortint=(-1,0,1);
var s:array [1..100] of string;
f:array [0..101,1..10] of longint;
n,m,j,k:integer;
i:longint;
function min(x,y:longint):longint;
begin
if x>y then exit(y);
exit(x);
end;
function value(y:shortint):boolean;
begin
exit((y>=1) and (y<=m));
end;
function calc(x:shortint;y:integer;z:shortint):shortint;
var code,xx,yy,zz:integer;
begin
val(s[y-1][z],xx,code);
val(s[y-2][z],yy,code);
if x<>2 then calc:=yy
else calc:=xx+yy;
end;
begin
readln(n,m);
for i:=1 to n do
begin
readln(s[i]);
while pos(’ ’,s[i])>0 do
delete(s[i],pos(’ ’,s[i]),1);
end;
for i:=1 to m do
f[n+1,i]:=0;
for i:=1 to n do
for j:=1 to m do
f[i,j]:=maxlongint;
if odd(n) then
begin
for i:=n div 2 downto 0 do
for j:=1 to m do
for k:=1 to 3 do
if value(j+fx[k]) then f[i*2,j]:=min(f[i*2,j],f[i*2+2,j+fx[k]]+calc(k,i*2+2,j))
end
else
for i:=(n div 2)-1 downto 0 do
for j:=1 to m do
for k:=1 to 3 do
if value(j+fx[k]) then f[i*2+1,j]:=min(f[i*2+1,j],f[i*2+3,j+fx[k]]+calc(k,i*2+3,j));
i:=maxlongint;
if odd(n) then
for j:=1 to m do
i:=min(i,f[0,j])
else
for j:=1 to m do
i:=min(i,f[1,j]);
writeln(i);
end.