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

Содержание

Слайд 2

Рейтинг за домашнюю работу

Рейтинг за домашнюю работу

Слайд 3

Динамическое программирование — это когда у нас есть задача, которую непонятно

Динамическое программирование — это когда у нас есть задача, которую непонятно

как решать, и мы разбиваем ее на меньшие задачи, которые тоже непонятно как решать. (с) А. Кумок.
Слайд 4

Задача про черепашку Есть клетчатое поле NхM. В левом верхнем углу

Задача про черепашку

Есть клетчатое поле NхM. В левом верхнем углу сидит

черепашка. Она умеет ходить только вправо или вниз.
А) Сколько у неё разных путей до правого нижнего угла?
Слайд 5

Первая основная идея ДП Будем искать ответ не только на нашу

Первая основная идея ДП

Будем искать ответ не только на нашу общую

задачу, но и на более мелкие аналогичные задачи («подзадача»). В нашем случае решим для каждой клетки поля сколькими способами до неё можно добраться.
Слайд 6

А что дальше? Ответ для верхнего левого угла очевиден. У нас

А что дальше?

Ответ для верхнего левого угла очевиден. У нас только

один способ до него добраться.
Для клеток левого столбца и верхней строки тоже всё очевидно.
Слайд 7

Вторая основная идея ДП Решая задачу для очередной клетки, будем считать,

Вторая основная идея ДП

Решая задачу для очередной клетки, будем считать, что

мы уже знаем ответ для предыдущих клеток и попробуем, используя это знание, найти ответ для текущей.
Слайд 8

А как мы можем попасть в очередную клетку? Всё очевидно! Мы

А как мы можем попасть в очередную клетку?

Всё очевидно! Мы можем

прийти в неё либо с верхней, либо с левой клетки.
Answer[i][j] = Answer[i - 1][j] + Answer[i][j - 1]
Слайд 9

 

Слайд 10

Б) Пусть в каждой клетке поля записано некоторое число. Требуется найти

Б) Пусть в каждой клетке поля записано некоторое число. Требуется найти

максимальную сумму чисел, которую можно набрать по пути в правый нижний угол.
Слайд 11

 

Слайд 12

В результате получим такую таблицу:

В результате получим такую таблицу:

Слайд 13

Последовательность из нулей и единиц без двух единиц подряд.

Последовательность из нулей и единиц без двух единиц подряд.

 

Слайд 14

dp[i][j] – ответ для последовательности длины i, оканчивающейся на j dp[1][0]

dp[i][j] – ответ для последовательности длины i, оканчивающейся на j
dp[1][0] =

dp[1][1] = 1;
dp[i][0] = dp[i - 1][0] + dp[1 - 1][1];
dp[i][1] = dp[i - 1][1];
А можно заметить, что это числа Фибоначчи ☺
Слайд 15

Немного теории Определения: Состояние – это набор параметров, с помощью которых

Немного теории

Определения:
Состояние – это набор параметров, с помощью которых мы фиксируем

подзадачу
Переходы – это рекуррентное соотношение между состояниями
Порядок пересчёта – это порядок, по которому мы обходим состояния
Слайд 16

Чтобы успешно решить задачу динамикой нужно ответить на следующие вопросы: 1)

Чтобы успешно решить задачу динамикой нужно ответить на следующие вопросы:
1) Что

мы вычисляем?
2) Какие у нас состояния?
3) Каковы значения в начальных состояниях?
4) Какие переходы между состояниями?
5) Каков порядок пересчёта?
6) Где хранится ответ на задачу?
Слайд 17

Порядок пересчёта Существует три порядка пересчёта: Прямой Состояния последовательно пересчитываются исходя из уже посчитанных.

Порядок пересчёта

Существует три порядка пересчёта:
Прямой
Состояния последовательно пересчитываются исходя из уже посчитанных.

Слайд 18

2) Обратный Обновляются все состояния, зависящие от текущего состояния

2) Обратный
Обновляются все состояния, зависящие от текущего состояния

Слайд 19

3) Ленивая динамика Рекурсивная функция пересчёта динамики. Это что-то вроде поиска

3) Ленивая динамика
Рекурсивная функция пересчёта динамики. Это что-то вроде поиска в

глубину по ацикличному графу состояний, где рёбра – это зависимости между ними.
Слайд 20

Классы задач на ДП Подсчёт объектов, в том числе определение существования

Классы задач на ДП

Подсчёт объектов, в том числе определение существования объекта.

Т.е. надо посчитать, сколько всего существует объектов с заданными свойствами, или проверить, существует ли хотя бы один.
Нахождение оптимального объекта. Требуется в некотором множестве объектов найти в некотором смысле оптимальный.
Вывод k-ого объекта. Нужно найти в некотором порядке k-ый объект.
Слайд 21

Виды задач на ДП Линейное ДП Многомерное ДП ДП на подотрезках

Виды задач на ДП

Линейное ДП
Многомерное ДП
ДП на подотрезках
ДП по полной сумме
ДП

на ациклических графах
ДП на деревьях
Игры(ретро-анализ)
ДП на подмножествах.
ДП по профилю
Динамика по изломанному профилю
Слайд 22

Отдельно рассмотрим семейство задач о рюкзаке

Отдельно рассмотрим семейство задач о рюкзаке

 

Слайд 23

 

Слайд 24

Решение методом динамического программирования Пусть dp[i][j] – есть максимальная стоимость предметов

Решение методом динамического программирования

Пусть dp[i][j] – есть максимальная стоимость предметов ,

которое можно уложить в рюкзак вместимости j, если мы используем только первые i предметов.
dp[i][0] = dp[0][j] = 0;
dp[i][j] = max(dp[i-1][j], dp[i-1][j - wi] + pi);
Ответ: dp[N][W];
Слайд 25

Пример W = 13, N = 5 w1 = 3, p1

Пример

W = 13, N = 5
w1 = 3, p1 = 1
w2

= 4, p2 = 6
w3 = 5, p3 = 4
w4 = 8, p4 = 7
w5 = 9, p5 = 6
Слайд 26

Другие задачи семейства Ограниченный рюкзак - обобщение классической задачи, когда любой

Другие задачи семейства

Ограниченный рюкзак - обобщение классической задачи, когда любой предмет

может быть взят некоторое количество раз.
Пример: Вор грабит склад. Он может унести ограниченный вес, каждый товар на складе содержится в определенном ограниченном количестве. Нужно унести предметов на максимальную сумму.
Варианты решения:
Перебор.
Методом динамического программирования.
Слайд 27

Решение методом ДП

Решение методом ДП

 

Слайд 28

Неограниченный рюкзак - обобщение ограниченного рюкзака, в котором любой предмет может

Неограниченный рюкзак - обобщение ограниченного рюкзака, в котором любой предмет может

быть выбран любое количество раз.
Пример: Перекупщик закупается на оптовой базе. Он может увезти ограниченное количество товара, количество товара каждого типа на базе не ограниченно. Нужно увезти товар на максимальную сумму.
Варианты решения:
Перебор.
Методом динамического программирования.
Слайд 29

Пусть dp[i][j] – есть максимальная стоимость предметов , которое можно уложить

Пусть dp[i][j] – есть максимальная стоимость предметов , которое можно уложить

в рюкзак вместимости j, если мы используем только первые i предметов.
dp[i][0] = dp[0][j] = 0;
dp[i][j] = max(dp[i-1][j], dp[i][j - wi] + pi);
Ответ: dp[N][W];
Слайд 30

Непрерывный рюкзак - вариант задачи, в котором возможно брать любою дробную

Непрерывный рюкзак - вариант задачи, в котором возможно брать любою дробную

часть от предмета, при этом удельная стоимость сохраняется.
Пример: Вор грабит мясника. Суммарно он может унести ограниченный вес товаров. Вор может резать товары без ущерба к удельной стоимости. Нужно унести товара на максимальную сумму.
Варианты решения:
Возможность брать любую часть от предмета сильно упрощает задачу. Жадный алгоритм дает оптимальное решение в данном случае.
Слайд 31