- •1Динамическое программирование
- •1.1Введение
- •1.2Поиск максимальной суммы
- •1.3 Перемножение нескольких матриц
- •1.3.1Количество расстановок скобок
- •1.3.2Шаг 1: строение оптимальной расстановки скобок
- •1.3.3Шаг 2: рекуррентное соотношение
- •1.3.4Шаг 3: вычисление оптимальной стоимости
- •1.4Когда применимо динамическое программирование
- •1.4.1Оптимальность для подзадач
- •1.4.2Перекрывающиеся подзадачи
- •1.5Задача о замене оборудования
- •2Жадные алгоритмы
- •2.1Задача о выборе заявок
- •2.1.1Правильность алгоритма
- •2.2Когда применим жадный алгоритм
- •2.2.1Принцип жадного выбора
- •2.2.2Оптимальность для подзадач
- •2.2.3Жадный алгоритм или динамическое программирование?
1.3.3Шаг 2: рекуррентное соотношение
Теперь
надо выразить стоимость оптимального
решения задачи через стоимости оптимальных
решений её подзадач. Такими подзадачами
будут задачи об оптимальной расстановке
скобок в произведениях
для
.
Обозначим через
минимальное количество умножений,
необходимое для вычисления матрицы
,
в частности, стоимость вычисления всего
произведения
есть
.
Числа
можно вычислить так. Если
,
то последовательность состоит из одной
матрицы
,
и умножения вообще не нужны. Стало быть,
для
.
Чтобы подсчитать
для
,
мы воспользуемся информацией о строении
оптимального решения, полученной на
шаге 1. Пусть при оптимальной расстановке
скобок в произведении
последним идет умножение
на
,
где
.
Тогда
равно сумме минимальных стоимостей
вычисления произведении
и
плюс стоимость перемножения этих двух
матриц. Поскольку для вычисления
произведения
требуется
умножений, то
.
В этом
соотношении подразумевается, что
оптимальное значение
нам известно; на деле это не так. Однако
число
может принимать всего лишь
различных значений:
.
Поскольку одно из них оптимально,
достаточно перебрать эти значения
и выбрать наилучшее. Получаем рекуррентную
формулу:
(*)
Числа
- стоимости оптимальных решений подзадач.
Чтобы проследить за тем, как получается
оптимальное решение, обозначим через
оптимальное место последнего умножения,
то есть такое
,
что при оптимальном вычислении
произведения
последним идет умножение
на
Иными словами,
равно числу
,
для которого
1.3.4Шаг 3: вычисление оптимальной стоимости
Пользуясь
соотношениями (16.2), теперь легко написать
рекурсивный алгоритм, определяющий
минимальную стоимость вычисления
произведения
(т.е. число
).
Однако время работы такого алгоритма
экспоненциально зависит от
,
так что этот алгоритм не лучше полного
перебора Настоящий выигрыш во времени
мы получим, если воспользуемся тем, что
подзадач относительно немного: по одной
задаче для каждой пары
,
для которой
,
а всего
.
Экспоненциальное время работы возникает
потому, что рекурсивный алгоритм решает
каждую из подзадач по многу раз, на
разных ветвях дерева рекурсии. Такое
«перекрытие подзадач» - характерный
признак задач, решаемых методом
динамического программирования.
Вместо рекурсии мы вычислим оптимальную стоимость «снизу вверх» -
Заполняя
таблицу
,
нужно последовательно решить задачи
об оптимальной расстановке скобок для
одного, двух, ...,
сомножителей. В самом деле, соотношение
(*) показывает, что число
— стоимость перемножения
матриц — зависит только от стоимостей
перемножения меньшего (чем
)
числа матриц.
Сначала
нужно задать
для
:
стоимость перемножения последовательности
из одной матрицы равна нулю. Затем
вычисляются (с помощью соотношения (*))
значения
для
— это минимальные стоимости для
последовательностей длины 2. Следом
рассчитываются значения
для
— это минимальные стоимости перемножения
последовательностей длины 3, и так далее.
1.4Когда применимо динамическое программирование
Укажем два признака, характерных для задач, решаемых методом динамического программирования.
