- •Рекурсивные алгоритмы (продолжение)
- •I, j: integer;
- •I, j: integer;
- •I, j: integer;
- •Метод динамического программирования
- •I, j: integer;
- •I, j: Integer;
- •I, j: integer;
- •Тип «Денежный»
- •Стандартные процедуры и функции для работы с любыми файлами
- •Текстовый файл
- •Стандартные процедуры для работы с текстовыми файлами
- •Условная компиляция
- •I, j: Integer;
- •I, j: Integer;
- •I, j: Integer;
- •I, j: integer;
Метод динамического программирования
Пример. Найти наиболее «дешевый» путь от элемента матрицы размера до элемента . Второй способ решения задачи.
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.