Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Динамическое программирование.doc
Скачиваний:
20
Добавлен:
05.11.2018
Размер:
1.1 Mб
Скачать

“ДИНАМИЧЕСКОЕ ПРОГРАММИРОВАНИЕ”

Содержание

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

1. Перемножение нескольких матриц…………………………………….…..5

2. Когда применимо динамическое программирование……………………12

3. Наибольшая общая подпоследовательность…………………………..…17

4. Оптимальная триангуляция многоугольника……………………….........21

Замечания………………………………………………………………..25

Заключение………………………………………………………………27

Приложение……………………………………………………………...28

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

Подобно методу «разделяй и властвуй», динамическое программирование решает задачу, разбивая её на подзадачи и объединяя их решения. Как мы видели в главе 1, алгоритмы типа «разделяй и властвуй» делят задачу на независимые подзадачи, эти подзадачи—на более мелкие подзадачи и так далее, а затем собирают решение основной задачи «снизу вверх». Динамическое программирование применимо тогда, когда подзадачи не являются независимыми, иными словами, когда у подзадач есть общие «подподзадачи». В этом случае алгоритм типа «разделяй и властвуй» будет делать лишнюю работу, решая одни и те же подподзадачи по нескольку раз. Алгоритм, основанный на динамическом программировании, решает каждую из подзадач единожды и запоминает ответы в специальной таблице. Это позволяет не вычислять заново ответ к уже встречавшейся подзадаче.

В типичном случае динамическое программирование применяется к задаче оптимизации (optimization problems). У такой задачи может быть много возможных решений; их «качество» определяется значением какого-то параметра и требуется выбрать оптимальное решение, при котором значение параметра будет минимальным или максимальным (в зависимости от постановки задачи) Вообще говоря, оптимум может достигаться для нескольких разных решений

Как строится алгоритм, основанный на динамическом программировании. Надо:

1) описать строение оптимальных решений,

2) выписать рекуррентное соотношение, связывающее оптимальные значение параметра для подзадач,

3) двигаясь снизу вверх, вычислить оптимальное значение параметра для подзадач,

4) пользуясь полученной информацией, построить оптимальное решение.

Основную часть работы составляют шаги 1-3. Если нас интересует только оптимальное значение параметра, шаг 4 не нужен. Если же шаг 4 необходим, для построения оптимального решения иногда приходится получать и хранить:

дополнительную информацию в процессе выполнения шага 3.

В этой главе мы решим несколько оптимизационных задач с помощью динамического программирования. В разделе 16.1 мы выясним, как найти произведение нескольких матриц, сделав как можно меньше умножений. В разделе 2 мы обсудим, какие свойства задачи делают возможным применение динамического программирования. После этого мы расскажем (в разделе 3), как найти наибольшую общую подпоследовательность двух последовательностей. Наконец, в разделе 4 мы воспользуемся динамическим программированием для нахождения оптимальной триангуляции выпуклого многоугольника. (Удивительным образом эта задача оказывается похожей на задачу о перемножении нескольких матриц.)