Мінімальний шлях у
таблиці
У
прямокутній таблиці N×M (у кожній клітинці якої записано
деякое число) на початку гравець знаходиться у лівій верхній клітинці. За один
хід йому дозволяється переміщуватись у сусідню клітинку або праворуч, або вниз
(ліворуч і вгору переміщуватись заборонено). При проході через клітинку з
гравця беруть стількт у.о., яке число записано у цій клітинці (гроші беруть
також за першу та останню клітинки його шляху).
Потрібно
знайти мінімальну суму в у.о., заплативши яку гравець може потрапити у правий
нижній кут.
Вхідні дані
У
вхідному файлі задано два числа N і M - розміри таблиці (1 ≤ N ≤ 20, 1 ≤ M ≤ 20). Далі йде N рядків по M чисел у кожному - розміри штрафів в
у.о. за проходження через відповідні клітинки (числа від 0 до 100).
Вихідні дані
У
вихідний файл запишіть мінімальну суму, витративши яку можна потрапити у правий
нижній кут.
Вхідні дані
3 4
1 1 1 1
5 2 2 100
9 4 2 1
Вихідні дані
8
program dfgdf;
var i,j,k,n,m,t : integer;
s1 : int64;
s,l,a :
array[1..100,1..100] of integer;
p : array [1..2,1..201] of
integer;
BEGIN
readln (n,m);
t:=1;
for i:=1 to n do
for j:=1 to m do read (a[i,j]);
s1:=a[1,1];
l[n,m]:=a[n,m]; s[n,m]:=0;
for i:=n-1 downto 1 do begin
l[i,m]:=l[i+1,m]+a[i,m];
s[i,m]:=0;
end;
for i:=m-1 downto 1 do begin
l[n,i]:=l[n,i+1]+a[n,i];
s[n,i]:=1;
end;
for j:=m-1 downto 1 do begin
for i:=n-1 downto 1 do begin
if l[i,j+1]<l[i+1,j] then begin
l[i,j]:=a[i,j]+l[i,j+1]; s[i,j]:=1; end else
begin l[i,j]:=a[i,j]+l[i+1,j];
s[i,j]:=0; end;
end;
end;
i:=1; j:=1; k:=1;
while k < n+m do begin
p[1,k]:=i; p[2,k]:=j; k:=k+1;
if s[i,j] = 1 then j:=j+1 else i:=i+1;
s1:=s1+a[i,j];
end;
writeln (s1);
END.
Немає коментарів:
Дописати коментар