Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль / okulov / okulov / chapter2.DOC
Скачиваний:
99
Добавлен:
10.12.2013
Размер:
7.1 Mб
Скачать

2.2.2. Треугольник

На рисунке изображен треугольник из чисел. Напишите программу, которая вычисляет наибольшую сумму чисел, расположенных на пути, начинающемся в верхней точке треугольника и заканчивающемся на основании треугольника.

7

3

8

8

1

0

2

7

4

4

4

5

2

6

5

  • Каждый шаг на пути может осуществляться вниз по диагонали влево или вниз по диагонали вправо.

  • Число строк в треугольнике > 1 и <100.

  • Треугольник составлен из целых чисел от 0 до 99.

    Рассмотрим идею решения на примере, приведенном в тексте задачи. Входные данные запишем в матрицу D. Она, для примера, имеет вид:

7 0 0 0 0

3 8 0 0 0

8 1 0 0 0

2 7 4 4 0

4 5 2 6 5

Будем вычислять матрицу R:array[1..MaxN,0..MaxN+1] следующим образом, предварительно обнулив ее элементы:

R[1,1]=D[1,1]

R[i,j]=max(D[i,j]+R[i-1,j],D[i,j]+R[i-1,j-1])

для i=2..N; j=1..i.

Ее вид:

0 7

0 10 15

0 18 16 15

0 20 25 20 19

0 24 30 27 26 24

Осталось найти наибольшее значение в последней строке матрицы R. Итак, в решении задачи используются идеи метода динамического программирования.

2.2.3 Степень числа

Даны два натуральных числа n иk. Требуется определить выражение, которое вычисляетkn . Разрешается использовать операции умножения и возведения в степень, круглыми скобками и переменной с именемk.Умножение считается одной операцией, возведению в степень qсоответствуетq-1операция. Найти минимальное количество операций, необходимое для возведения в степеньn. Желательно сделать это для как можно больших значенийn.

Пример. При n=5необходимо три операции- (k*k)2*k.

Определим массив Op, его элементOp[i] предназначен для хранения минимального количества операции при возведении в степеньi (Op[1]=0). Для вычисления выражения, дающегоn-ю степень числаk, арифметические операции применяют в некоторой последовательности, согласно приоритетам и расставленным скобкам. Рассмотрим последнюю примененную операцию.

Если это было умножение, тогда сомножителями являются натуральные степени числа k, которые в сумме даютn. Степень каждого из сомножителей меньшеn, и ранее вычислено, за какое минимальное число операций ее можно получить. Итак:

opn1:=min{по всемp:1£p<n, Op[p]+Op[n-p]+1}.

Если это возведение в степень:

opn2:=min{для всех p (¹1) - делителейn, Op[n div p]+p-1}.

Результат -Op[n]=min(opn1,opn2). Фрагмент реализации:

......

Op[1]:=0;

for n:=2 to ???? do begin

opn:=n;{opn - рабочая переменная}

for p:=1 to n-1 do begin

opn:=Min(opn,Op[p]+Op[n-p]+1);{Min- функция поиска минимума двух чисел}

if (n mod p=0) and (p<>1) then opn:=Min(opn,Op[n div p]+p-1);

end;

Op[n]:=opn;

end;

....

2.2.4. Автозаправка

Вдоль кольцевой дороги расположено mгородов, в каждом из которых есть автозаправочная станция. Известна стоимостьZ[i]заправки в городе с номеромiи стоимостьC[i] проезда по дороге, соединяющейi - й и(i+1)-й города,C[m] - стоимость проезда между первым иm-м городами. Для жителей каждого города определить город, в который им необходимо съездить, чтобы заправиться самым дешевым образом, и направление - «по часовой стрелке» или «против часовой стрелки», города пронумерованы по часовой стрелке.

Не будем рассматривать переборный вариант решения задачи, суть которого в проверке всех 2*mвариантов для жителей каждого города, итого - 2*m*m проверок. Введем два дополнительных массива

On, Ag: array[1..m] of record wh, qh:integer; end; .

On[i]означает, где следует заправляться (wh)и стоимость заправки(qh) жителямi-го города, если движение разрешено только по часовой стрелке. В этом случае жители городаiимеют две альтернативы: либо заправляться у себя в городе, либо ехать по часовой стрелке. Во втором случае жителям городаiнадо заправляться там же, где и жителям городаi+1,или в первом, еслиi=m. Итак,On[i]=min{Z[i],C[i]+On[i+1].qh}.Откуда известно значениеOn[i+1].qh?Необходимо найти городjс минимальной стоимостью заправки -On[j]:=(j,Z[j]). После этого можно последовательно вычислять значенияOn[j-1], On[j-2], ..., On[j+1]. Аналогичные действия необходимо выполнить при формировании массиваAg[i], после этого для жителей каждого городаi следует выбрать лучший изOn[i].qh иAg[i].qhвариант заправки.

Соседние файлы в папке okulov