Разделы презентаций


Динамическое программирование. Примеры задач

Содержание

Цель лекцииИзучить еще несколько примеров задач, решаемых с помощью динамического программирования, и их решения

Слайды и текст этой презентации

Слайд 1Динамическое программирование. Примеры задач
Федор Царев
Спецкурс «Олимпиадное программирование»
Лекция 5

13.04.2009
Санкт-Петербург, Гимназия 261

Динамическое программирование. Примеры задачФедор ЦаревСпецкурс «Олимпиадное программирование»Лекция 513.04.2009Санкт-Петербург, Гимназия 261

Слайд 2Цель лекции
Изучить еще несколько примеров задач, решаемых с помощью динамического

программирования, и их решения

Цель лекцииИзучить еще несколько примеров задач, решаемых с помощью динамического программирования, и их решения

Слайд 3Признаки возможности применения ДП
Возможность разбиения задачи на подзадачи (метод «разделяй-и-властвуй»)
Наличие

свойства оптимальности для подзадач – оптимальный ответ для большой задачи

строится на основе оптимальных ответов для меньших
Наличие перекрывающихся подзадач
Признаки возможности применения ДПВозможность разбиения задачи на подзадачи (метод «разделяй-и-властвуй»)Наличие свойства оптимальности для подзадач – оптимальный ответ

Слайд 4Этапы решения задачи методом динамического программирования
Разбиение задачи на подзадачи
Построение рекуррентной

формулы для вычисления значения функции (включая начальные условия)
Вычисление значения функции

для всех подзадач (важен порядок вычисления)
Восстановление структуры оптимального ответа


Этапы решения задачи методом динамического программированияРазбиение задачи на подзадачиПостроение рекуррентной формулы для вычисления значения функции (включая начальные

Слайд 5Наибольшая возрастающая подпоследовательность
Задана последовательность чисел a1, a2, …, an
Необходимо найти

возрастающую подпоследовательность наибольшей длины

1 5 3 7 1 4 10

15
Наибольшая возрастающая подпоследовательностьЗадана последовательность чисел a1, a2, …, anНеобходимо найти возрастающую подпоследовательность наибольшей длины1 5 3 7

Слайд 6Перебор?
Число различных подпоследовательностей: (2n – 1)
Можно применять для n ≤

20

Перебор?Число различных подпоследовательностей: (2n – 1)Можно применять для n ≤ 20

Слайд 7Разбиение на подзадачи
Идея: найти наибольшую возрастающую подпоследовательность среди первых i

элементов: a1, a2, …, ai
Попробуйте построить рекуррентную формулу
Более точно: найти

наибольшую возрастающую подпоследовательность среди первых i элементов: a1, a2, …, ai, последний элемент в которой - ai
Разбиение на подзадачиИдея: найти наибольшую возрастающую подпоследовательность среди первых i элементов: a1, a2, …, aiПопробуйте построить рекуррентную

Слайд 8Рекуррентная формула
d[i] – длина наибольшей возрастающей подпоследовательности, которая заканчивается в

ai
Считается, что максимум равен нулю, если таких индексов j нет

Рекуррентная формулаd[i] – длина наибольшей возрастающей подпоследовательности, которая заканчивается в aiСчитается, что максимум равен нулю, если таких

Слайд 9Начальные условия
Можно сделать немного проще
Считаем, что в начало добавлен a0=–∞,

а d[0] = 0
Теперь можно не делать никаких предположений, так

как всегда найдется некоторый индекс j
Начальные условияМожно сделать немного прощеСчитаем, что в начало добавлен a0=–∞, а d[0] = 0Теперь можно не делать

Слайд 10Пример (1)

Пример (1)

Слайд 11Пример (2)

Пример (2)

Слайд 12Пример (3)

Пример (3)

Слайд 13Пример (4)

Пример (4)

Слайд 14Пример (5)

Пример (5)

Слайд 15Пример (6)

Пример (6)

Слайд 16Пример (7)

Пример (7)

Слайд 17Пример (8)

Пример (8)

Слайд 18Пример (9)

Пример (9)

Слайд 19Программа
d[0] := 0;
for i := 1 to n do begin
max

:= 0;
for j := 1 to i – 1 do

begin
if (a[j] < a[i]) and
(d[j] > max) then begin
max := d[j];
end;
end;
d[i] := max + 1;
end;
Программаd[0] := 0;for i := 1 to n do begin	max := 0;	for j := 1 to i

Слайд 20Восстановление ответа
Где находится длина L наибольшей возрастающей подпоследовательности?
L := 0;
pos

:= -1;
for i := 1 to n do begin
if (d[i]

> max) then begin
max := d[i];
pos := i;
end;
end;
Восстановление ответаГде находится длина L наибольшей возрастающей подпоследовательности?L := 0;pos := -1;for i := 1 to n

Слайд 21Вычисление с сохранением информации для восстановления ответа
d[0] := 0;
prev[0] :=

-1;
for i := 1 to n do begin
max := 0;
bestj

:= -1;
for j := 1 to i – 1 do begin
if (a[j] < a[i]) and
(d[j] > max) then begin
max := d[j];
bestj := j;
end;
end;
d[i] := max + 1;
prev[i] := bestj;
end;
Вычисление с сохранением информации для восстановления ответаd[0] := 0;prev[0] := -1;for i := 1 to n do

Слайд 22Восстановление ответа
procedure restore(i : integer);
begin
if (i > 0) then begin
restore(prev[i]);
write(a[i]);
end;
end;

Восстановление ответаprocedure restore(i : integer);begin	if (i > 0) then begin		restore(prev[i]);		write(a[i]);	end;end;

Слайд 23Пример
1 3 4 10 15

Пример1 3 4 10 15

Слайд 24Время работы
Время работы этого алгоритма – O(n2)
Можно ли быстрее?

Время работыВремя работы этого алгоритма – O(n2)Можно ли быстрее?

Слайд 25Более быстрый алгоритм
Похоже, что от вычисления d[i] никуда не деться
Попробуем

вычислять d[i] быстрее
Пусть last[i] – минимальное последнее число в возрастающей

подпоследовательности длины i
Более быстрый алгоритмПохоже, что от вычисления d[i] никуда не детьсяПопробуем вычислять d[i] быстрееПусть last[i] – минимальное последнее

Слайд 26Свойство массива last
Этот массив является неубывающим
Действительно, пусть i < j,

но last[i] > last[j]
Из подпоследовательности длины i можно сделать подпоследовательность

длины j, поэтому last[j] ≤ last[i] (last[j] – минимальный, last[i] – некоторый)
Свойство массива lastЭтот массив является неубывающимДействительно, пусть i < j, но last[i] > last[j]Из подпоследовательности длины i

Слайд 27Вычисление d[i]
Находим место в массиве last, на которое следует поставить

a[i] – такую позицию j, что last[j-1] < a[i] ≤

last[j]
Это означает, что максимальная длина подпоследовательности, которая заканчивается в a[i] есть j (d[i] = j)
Позицию j надо искать с помощью двоичного поиска
Время работы алгоритма – O(nlogn)

Вычисление d[i]Находим место в массиве last, на которое следует поставить a[i] – такую позицию j, что last[j-1]

Слайд 28Упражнения
Продумать, как сохранять информацию для восстановления ответа
Реализовать этот алгоритм

УпражненияПродумать, как сохранять информацию для восстановления ответаРеализовать этот алгоритм

Слайд 29Задача о рюкзаке
Есть рюкзак вместимостью W и n предметов, каждый

из которых характеризуется ценностью pi и весом wi
Необходимо выбрать несколько

предметов так, чтобы их суммарная ценность была максимальна, а суммарный вес не превышал W
Задача о рюкзакеЕсть рюкзак вместимостью W и n предметов, каждый из которых характеризуется ценностью pi и весом

Слайд 30Разбиение на подзадачи
Два параметра – число обработанных предметов и вместимость

рюкзака
c[i][j] – максимальная суммарная стоимость, которую можно набрать первыми i

предметами так, чтобы их вес не превосходил j
Разбиение на подзадачиДва параметра – число обработанных предметов и вместимость рюкзакаc[i][j] – максимальная суммарная стоимость, которую можно

Слайд 31Рекуррентная формула
Очередной предмет можно либо взять, либо не взять

Рекуррентная формулаОчередной предмет можно либо взять, либо не взять

Слайд 32Начальные условия
c[0][j] = 0 для j=0…W
c[i][0] = 0 для i=0…n

Начальные условияc[0][j] = 0 для j=0…Wc[i][0] = 0 для i=0…n

Слайд 33Два способа реализации
Метод заполнения таблицы можно реализовать двумя способами
«Динамика назад»

(этот метод использовался во всех рассмотренных задачах)
«Динамика вперед»

Два способа реализацииМетод заполнения таблицы можно реализовать двумя способами«Динамика назад» (этот метод использовался во всех рассмотренных задачах)«Динамика

Слайд 34«Динамика вперед»
for i := 0 to n do begin
for j

:= 0 to W do begin
c[i][j] := -INF;
end;
end;
for i :=

0 to n – 1 do begin
for j := 0 to W do begin
if (c[i][j] = -INF) then continue;
c[i+1][j]:=max(c[i][j], c[i+1][j]);
if (j + w[i + 1] <= W) then begin
c[i + 1][j + w[i + 1]] = max(c[i][j] + p[i+1],
c[i + 1][j + w[i + 1]]);
end;
end;
end;
«Динамика вперед»for i := 0 to n do begin	for j := 0 to W do begin		c[i][j] :=

Слайд 35Восстановление ответа
Необходимо запоминать для каждого состояния (i, j) надо ли

брать очередной предмет
Реализуйте сами!

Восстановление ответаНеобходимо запоминать для каждого состояния (i, j) надо ли брать очередной предметРеализуйте сами!

Слайд 36Время работы алгоритма
Время работы этого алгоритма – O(nW)
Таким образом, он

применим только для относительно небольших значений весов предметов

Время работы алгоритмаВремя работы этого алгоритма – O(nW)Таким образом, он применим только для относительно небольших значений весов

Слайд 37Упражнения
Решите задачу о рюкзаке для случая, когда имеется неограниченное число

предметов каждого типа
Решите задачу о рюкзаке для случая, когда предметы

можно брать не полностью (не золотые слитки, а золотой песок)
Решите смешанную задачу о рюкзаке – часть предметов можно брать только полностью, а остальные – можно и не полностью
УпражненияРешите задачу о рюкзаке для случая, когда имеется неограниченное число предметов каждого типаРешите задачу о рюкзаке для

Слайд 38Оптимальная триангуляция многоугольника
Задан выпуклый многоугольник
Необходимо разбить его на треугольники, проведя

несколько диагоналей
Суммарный периметр треугольников должен быть как можно меньшим
Кстати, сколько

придется провести диагоналей, если в многоугольнике N углов?
Оптимальная триангуляция многоугольникаЗадан выпуклый многоугольникНеобходимо разбить его на треугольники, проведя несколько диагоналейСуммарный периметр треугольников должен быть как

Слайд 39Нумерация вершин многоугольника
Вершины (n+1)-угольника нумеруются числами от 0 до n
При

этом когда говорится о вершине «номер k» имеется в виду

вершина «номер k mod n» (то есть vn=v0, …)
Нумерация вершин многоугольникаВершины (n+1)-угольника нумеруются числами от 0 до nПри этом когда говорится о вершине «номер k»

Слайд 40Разбиение на подзадачи
После вырезания одного треугольника, многоугольника распадается на два,

которые можно рассматривать отдельно

Разбиение на подзадачиПосле вырезания одного треугольника, многоугольника распадается на два, которые можно рассматривать отдельно

Слайд 41Строение оптимального решения
Рассмотрим оптимальную триангуляцию заданного (n+1)-угольника v0,v1, …, vn
Ребро

v0vn входит в некоторый треугольник
Пусть это треугольник v0vnvk
Тогда стоимость триангуляции

равна
Стоимость этого треугольника +
Стоимость триангуляции v0, v1, …, vk +
Стоимость триангуляции vk, vk+1, …, vn
Строение оптимального решенияРассмотрим оптимальную триангуляцию заданного (n+1)-угольника v0,v1, …, vnРебро v0vn входит в некоторый треугольникПусть это треугольник

Слайд 42Рекуррентная формула
d[i][j] – минимальная стоимость триангуляции многоугольника vi-1…vj (1≤i

в d[1][n]
Начальные условия:
d[i][i] = 0
d[i][j] = -∞ при i >

j
Рекуррентная формулаd[i][j] – минимальная стоимость триангуляции многоугольника vi-1…vj (1≤i j

Слайд 43Восстановление ответа
Для каждой подзадачи необходимо запомнить оптимальное значение числа k
Реализуйте

самостоятельно!

Восстановление ответаДля каждой подзадачи необходимо запомнить оптимальное значение числа kРеализуйте самостоятельно!

Слайд 44Упражнения
Пусть стоимостью треугольника считается его площадь. Как найти оптимальную триангуляцию?
Пусть

необходимо минимизировать суммарную длину проведенных диагоналей. Как найти оптимальную триангуляцию

в этом случае?
УпражненияПусть стоимостью треугольника считается его площадь. Как найти оптимальную триангуляцию?Пусть необходимо минимизировать суммарную длину проведенных диагоналей. Как

Слайд 45Выводы
Рассмотрены три примера задач, решаемых методом динамического программирования
Метод заполнения таблицы

может быть реализован двумя способами – «динамика вперед» и «динамика

назад»
Необходимо следить за тем, чтобы не выполнялись переходы из недостижимых состояний

ВыводыРассмотрены три примера задач, решаемых методом динамического программированияМетод заполнения таблицы может быть реализован двумя способами – «динамика

Слайд 46Спасибо за внимание!
Вопросы? Комментарии?
fedor.tsarev@gmail.com

Спасибо за внимание!Вопросы? Комментарии?fedor.tsarev@gmail.com

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика