print6. Динамическое программирование

printРазбор задачи 584. Broken Sword: потерянный файл

uses math;
const inf=1000000;
var n,i,j,k,r:integer;
  a:array[1..1001] of integer; { количество ящиков в i-м штабеле }
  t:array[0..1001,0..100] of integer;
    { таблица для динамического программирования -
      количество ящиков, которые нужно переместить, 
      чтобы оказаться i-м штабеле на высоте j }
begin
  read(n);
  for i:=1 to n do
    read(a[i]);
  for j:=1 to 100 do
    t[0,j]:=inf; { нельзя сделать выше начальную клетку }
  for i:=1 to n+1 do
    for j:=0 to 100 do { проверяем все высоты }
    begin
      r:=inf;
      for k:=max(0,j-2) to min(100,j+2) do 
        { проверяем все достижимые с высоты j }
        r:=min(r,t[i-1,k]); { находим минимум }
      t[i,j]:=r+abs(a[i]-j); { минимум + количество ящиков,
         которые нужно добавить/убрать для получения высоты j }
    end;
  writeln(t[n+1,0]);
end.
loading