Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
L05.doc
Скачиваний:
2
Добавлен:
12.11.2018
Размер:
124.42 Кб
Скачать

Метод динамического программирования

Пример. Найти наиболее «дешевый» путь от элемента матрицы размера до элемента . Второй способ решения задачи.

program Project3B;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

mMax = 20;

nMax = 20;

type

MyRecord = record

CellPrice, PathPrice: integer;

Direction: char;

end;

MyArray = array[1 .. mMax, 1 .. nMax] of MyRecord;

var

m, n, p: integer;

A: MyArray;

procedure InitArray(var C: MyArray);

var

I, j: integer;

begin

Randomize;

m := 3 + Random(mMax – 2);

n := 3 + Random(nMax – 2);

Writeln('m=', m , ' n=', n);

for i := 1 to m do

for j := 1 to n do

begin

C[i][j].CellPrice := Random(mMax + nMax);

C[i][j].PathPrice := 0;

C[i][j].Direction := '?';

end;

end;

procedure ShowPrices(var C: MyArray);

var

I, j: Integer;

begin

Writeln('ShowPrices');

for i := 1 to m do

begin

for j := 1 to n do

Write(C[i][j].CellPrice : 5);

Writeln;

end;

end;

procedure ShowDirections(var C: MyArray);

var

I, j: integer;

begin

Writeln('ShowDirections');

for i := 1 to m do

begin

for j := 1 to n do

Write(C[i][j].Direction : 3);

Writeln;

end;

end;

function Right(i, j: integer): boolean;

begin

if j < n then Right := true else Right := false;

end;

function Down(i, j: integer): boolean;

begin

if i < m then Down := true else Down := false;

end;

procedure BestPathNonRecoursive(var C: MyArray);

var

i, j, k, ir, id: integer;

begin

C[m][n].PathPrice := 0;

for k := m + n - 1 downto 1 do

for i := m downto 1 do

begin

j := k - i;

if j > n then break;

if j < 1 then continue;

if Right(i, j) then

ir := C[i][j + 1].CellPrice + C[i][j + 1].PathPrice

else

ir := -1;

if Down(i, j) then

id := C[i + 1][j].CellPrice + C[i + 1][j].PathPrice

else

id := -1;

if (ir >= 0) and (id >= 0) then

begin

if ir < id then

begin

C[i][j].Direction := 'r';

C[i][j].PathPrice := ir;

end

else

begin

C[i][j].Direction := 'd';

C[i][j].PathPrice := id;

end;

end

else

if ir >=0 then

begin

C[i][j].Direction := 'r'; C[i][j].PathPrice := ir;

end

else

if id >= 0 then

begin

C[i][j].Direction := 'd'; C[i][j].PathPrice := id;

end

else

Halt;

end;

end;

procedure ShowPath(var C: MyArray; var p: integer);

var

k, i, j: integer;

begin

i := 1;

j := 1;

for k := 1 to m + n - 2 do

begin

Write(' ', C[i][j].Direction);

if C[i][j].Direction = 'r' then

Inc(j)

else

if C[i][j].Direction = 'd' then

Inc(i)

else

Halt;

end;

Writeln;

end;

begin

InitArray(A);

ShowPrices(A);

BestPathNonRecoursive(A);

ShowPath(A, p);

Writeln('Price of best path = ', p);

ShowDirections(A);

Readln;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]