115
с/к “Эффективные алгоритмы” Лекция 16: Динамическое программирование А. Куликов Computer Science клуб при ПОМИ http://logic.pdmi.ras.ru/infclub/ А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 1 / 40

20080309 efficientalgorithms kulikov_lecture16

Embed Size (px)

Citation preview

Page 1: 20080309 efficientalgorithms kulikov_lecture16

с/к “Эффективные алгоритмы”Лекция 16: Динамическое программирование

А. Куликов

Computer Science клуб при ПОМИhttp://logic.pdmi.ras.ru/∼infclub/

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 1 / 40

Page 2: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 3: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 4: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 5: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 6: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 7: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 8: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40

Page 9: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 3 / 40

Page 10: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Кратчайшие пути в направленных ациклических графах

Рассмотрим направленный ациклический направленный граф.

s

c

a

d

b

e

1

24

3

6

1

2

1

Важным свойством такого графа является наличиетопологической сортировки его вершин.

s c a b d e1

2 4

3

6 1

2

1

Допустим, мы хотим найти длину кратчайшего пути от вершины sдо вершины d .Ясно, что dist(d) = min{dist(b) + 1, dist(c) + 3}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40

Page 11: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Кратчайшие пути в направленных ациклических графахРассмотрим направленный ациклический направленный граф.

s

c

a

d

b

e

1

24

3

6

1

2

1

Важным свойством такого графа является наличиетопологической сортировки его вершин.

s c a b d e1

2 4

3

6 1

2

1

Допустим, мы хотим найти длину кратчайшего пути от вершины sдо вершины d .Ясно, что dist(d) = min{dist(b) + 1, dist(c) + 3}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40

Page 12: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Кратчайшие пути в направленных ациклических графахРассмотрим направленный ациклический направленный граф.

s

c

a

d

b

e

1

24

3

6

1

2

1

Важным свойством такого графа является наличиетопологической сортировки его вершин.

s c a b d e1

2 4

3

6 1

2

1

Допустим, мы хотим найти длину кратчайшего пути от вершины sдо вершины d .Ясно, что dist(d) = min{dist(b) + 1, dist(c) + 3}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40

Page 13: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Кратчайшие пути в направленных ациклических графахРассмотрим направленный ациклический направленный граф.

s

c

a

d

b

e

1

24

3

6

1

2

1

Важным свойством такого графа является наличиетопологической сортировки его вершин.

s c a b d e1

2 4

3

6 1

2

1

Допустим, мы хотим найти длину кратчайшего пути от вершины sдо вершины d .

Ясно, что dist(d) = min{dist(b) + 1, dist(c) + 3}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40

Page 14: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Кратчайшие пути в направленных ациклических графахРассмотрим направленный ациклический направленный граф.

s

c

a

d

b

e

1

24

3

6

1

2

1

Важным свойством такого графа является наличиетопологической сортировки его вершин.

s c a b d e1

2 4

3

6 1

2

1

Допустим, мы хотим найти длину кратчайшего пути от вершины sдо вершины d .Ясно, что dist(d) = min{dist(b) + 1, dist(c) + 3}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40

Page 15: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Алгоритм

DAG-Shortest-Paths(G , s)1 инициализировать все значения массива dist значением ∞2 dist(s) = 03 for v ∈ V ∖ {s} в топологической сортировке вершин4 do dist(v) = min(u,v)∈E{dist(u) + d(u, v)}

ЗамечаниеАлгоритм решает множество подзадач {dist(u), u ∈ V } в порядкевозрастания их “сложности”.Говорим, что первая задача сложнее второй, если для решенияпервой необходимо знать ответ для второй.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40

Page 16: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Алгоритм

DAG-Shortest-Paths(G , s)1 инициализировать все значения массива dist значением ∞2 dist(s) = 03 for v ∈ V ∖ {s} в топологической сортировке вершин4 do dist(v) = min(u,v)∈E{dist(u) + d(u, v)}

Замечание

Алгоритм решает множество подзадач {dist(u), u ∈ V } в порядкевозрастания их “сложности”.Говорим, что первая задача сложнее второй, если для решенияпервой необходимо знать ответ для второй.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40

Page 17: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Алгоритм

DAG-Shortest-Paths(G , s)1 инициализировать все значения массива dist значением ∞2 dist(s) = 03 for v ∈ V ∖ {s} в топологической сортировке вершин4 do dist(v) = min(u,v)∈E{dist(u) + d(u, v)}

ЗамечаниеАлгоритм решает множество подзадач {dist(u), u ∈ V } в порядкевозрастания их “сложности”.

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40

Page 18: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути в направленных ациклических графах

Алгоритм

DAG-Shortest-Paths(G , s)1 инициализировать все значения массива dist значением ∞2 dist(s) = 03 for v ∈ V ∖ {s} в топологической сортировке вершин4 do dist(v) = min(u,v)∈E{dist(u) + d(u, v)}

ЗамечаниеАлгоритм решает множество подзадач {dist(u), u ∈ V } в порядкевозрастания их “сложности”.Говорим, что первая задача сложнее второй, если для решенияпервой необходимо знать ответ для второй.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40

Page 19: 20080309 efficientalgorithms kulikov_lecture16

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

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

Динамическое программирование решает задачу, разбивая её наподзадачи и решая их от простых к сложным, периодическииспользуя ответы для уже решенных подзадач.Подзадачи образуют направленный ациклический граф: извершины A идет ребро в вершину B , если для решения Aнеобходимо решить B .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40

Page 20: 20080309 efficientalgorithms kulikov_lecture16

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

Динамическое программированиеДинамическое программирование решает задачу, разбивая её наподзадачи и решая их от простых к сложным, периодическииспользуя ответы для уже решенных подзадач.

Подзадачи образуют направленный ациклический граф: извершины A идет ребро в вершину B , если для решения Aнеобходимо решить B .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40

Page 21: 20080309 efficientalgorithms kulikov_lecture16

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

Динамическое программированиеДинамическое программирование решает задачу, разбивая её наподзадачи и решая их от простых к сложным, периодическииспользуя ответы для уже решенных подзадач.Подзадачи образуют направленный ациклический граф: извершины A идет ребро в вершину B , если для решения Aнеобходимо решить B .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40

Page 22: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 7 / 40

Page 23: 20080309 efficientalgorithms kulikov_lecture16

Наибольшая возрастающая подпоследовательностьОпределениеЗадача о наибольшей возрастающей последовательности (longestincreasing subsequence problem) заключается в нахождении по даннойпоследовательности её возрастающей подпоследовательностимаксимальной длины.

ПримерРассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7.

5 2 8 6 3 6 9 7

Ясно, что нам просто нужно найти длиннейший путь в этом графе.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40

Page 24: 20080309 efficientalgorithms kulikov_lecture16

Наибольшая возрастающая подпоследовательностьОпределениеЗадача о наибольшей возрастающей последовательности (longestincreasing subsequence problem) заключается в нахождении по даннойпоследовательности её возрастающей подпоследовательностимаксимальной длины.

Пример

Рассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7.

5 2 8 6 3 6 9 7

Ясно, что нам просто нужно найти длиннейший путь в этом графе.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40

Page 25: 20080309 efficientalgorithms kulikov_lecture16

Наибольшая возрастающая подпоследовательностьОпределениеЗадача о наибольшей возрастающей последовательности (longestincreasing subsequence problem) заключается в нахождении по даннойпоследовательности её возрастающей подпоследовательностимаксимальной длины.

ПримерРассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7.

5 2 8 6 3 6 9 7

Ясно, что нам просто нужно найти длиннейший путь в этом графе.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40

Page 26: 20080309 efficientalgorithms kulikov_lecture16

Наибольшая возрастающая подпоследовательностьОпределениеЗадача о наибольшей возрастающей последовательности (longestincreasing subsequence problem) заключается в нахождении по даннойпоследовательности её возрастающей подпоследовательностимаксимальной длины.

ПримерРассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7.

5 2 8 6 3 6 9 7

Ясно, что нам просто нужно найти длиннейший путь в этом графе.А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40

Page 27: 20080309 efficientalgorithms kulikov_lecture16

Алгоритм

Алгоритм

1 for j ← 1 to n2 do L(j)← 1 + max{L(i) : (i , j) ∈ E}3 � L(j) — длина максимальной последовательности,

заканчивающейся в j-м элементе4 return maxj L(j)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 9 / 40

Page 28: 20080309 efficientalgorithms kulikov_lecture16

Замечания

Замечания

Время работы есть O(n2).Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важнымсвойством: на подзадачах задан частичный порядок и отношение,определяющее, как решить задачу по ее более простымподзадачам.Наш алгоритм находит длину максимальной возрастающейподпоследовательности, но его легко модифицировать так, чтобыон находил и саму максимальную подпоследовательность.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40

Page 29: 20080309 efficientalgorithms kulikov_lecture16

Замечания

ЗамечанияВремя работы есть O(n2).

Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важнымсвойством: на подзадачах задан частичный порядок и отношение,определяющее, как решить задачу по ее более простымподзадачам.Наш алгоритм находит длину максимальной возрастающейподпоследовательности, но его легко модифицировать так, чтобыон находил и саму максимальную подпоследовательность.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40

Page 30: 20080309 efficientalgorithms kulikov_lecture16

Замечания

ЗамечанияВремя работы есть O(n2).Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важнымсвойством: на подзадачах задан частичный порядок и отношение,определяющее, как решить задачу по ее более простымподзадачам.

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40

Page 31: 20080309 efficientalgorithms kulikov_lecture16

Замечания

ЗамечанияВремя работы есть O(n2).Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важнымсвойством: на подзадачах задан частичный порядок и отношение,определяющее, как решить задачу по ее более простымподзадачам.Наш алгоритм находит длину максимальной возрастающейподпоследовательности, но его легко модифицировать так, чтобыон находил и саму максимальную подпоследовательность.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40

Page 32: 20080309 efficientalgorithms kulikov_lecture16

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

Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.L(4)

L(1) L(2)

L(1)

L(3)

L(1) L(2)

L(1)

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40

Page 33: 20080309 efficientalgorithms kulikov_lecture16

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

Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.

L(4)

L(1) L(2)

L(1)

L(3)

L(1) L(2)

L(1)

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40

Page 34: 20080309 efficientalgorithms kulikov_lecture16

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

Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.L(4)

L(1) L(2)

L(1)

L(3)

L(1) L(2)

L(1)

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40

Page 35: 20080309 efficientalgorithms kulikov_lecture16

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

Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.L(4)

L(1) L(2)

L(1)

L(3)

L(1) L(2)

L(1)

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40

Page 36: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 12 / 40

Page 37: 20080309 efficientalgorithms kulikov_lecture16

Стоимость редактирования

ОпределениеЗадача о стоимости редактирования (edit distance problem)заключается в нахождении минимального количества вставок,удалений и замен букв, необходимых для того, чтобы из одноговходного слова получить другое.

Пример

E X P O N E N - T I A L- - P O L Y N O M I A L

Стоимость равна 6.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 13 / 40

Page 38: 20080309 efficientalgorithms kulikov_lecture16

Стоимость редактирования

ОпределениеЗадача о стоимости редактирования (edit distance problem)заключается в нахождении минимального количества вставок,удалений и замен букв, необходимых для того, чтобы из одноговходного слова получить другое.

Пример

E X P O N E N - T I A L- - P O L Y N O M I A L

Стоимость равна 6.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 13 / 40

Page 39: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

Подзадачи

Важным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 40: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.

Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 41: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].

Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 42: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .

Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 43: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).

E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 44: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.

Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 45: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиВажным моментом динамического программирования являетсявыбор подзадач.Нам нужно найти стоимость редактирования строчек x [1 . . . m] иy [1 . . . n].Естественной подзадачей является E (i , j) — стоимостьредактирования префикса длины i строчки x и префикса длины jстрочки y .Нашей целью является вычисление E (m, n).E (i , j) = min{1+E (i −1, j), 1+E (i , j−1), diff(i , j)+E (i −1, j−1)}.Значения E (i , j) записываются в таблицу, обходить которуюможно в любом порядке, лишь бы E (i , j) всегда шло позже, чемE (i − 1, j), E (i , j − 1), E (i − 1, j − 1).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40

Page 46: 20080309 efficientalgorithms kulikov_lecture16

Алгоритм

Алгоритм

1 for i ← 0 to m2 do E (i , 0) = i3 for j ← 0 to n4 do E (0, j) = j5 for i ← 1 to m6 do for j ← 1 to n7 do E (i , j)← min{E (i − 1, j) + 1, E (i , j − 1) + 1,

E (i − 1, j − 1) + diff(i , j)}8 return E (m, n)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 15 / 40

Page 47: 20080309 efficientalgorithms kulikov_lecture16

Соответствующий граф

P O L Y N O M I A L

E

X

P

O

N

E

N

T

I

A

L

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 16 / 40

Page 48: 20080309 efficientalgorithms kulikov_lecture16

Соответствующий граф

P O L Y N O M I A L

E

X

P

O

N

E

N

T

I

A

L

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 16 / 40

Page 49: 20080309 efficientalgorithms kulikov_lecture16

Соответствующий граф

P O L Y N O M I A L

E

X

P

O

N

E

N

T

I

A

L

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 16 / 40

Page 50: 20080309 efficientalgorithms kulikov_lecture16

Стандартные способы выбора подзадач

Стандартные способы выбора подзадач

вход подзадачаx1, . . . , xn x1, . . . , xi

x1, . . . , xn и y1, . . . , ym x1, . . . , xi и y1, . . . , yj

x1, . . . , xn xi , . . . , xj

дерево поддерево

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 17 / 40

Page 51: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 18 / 40

Page 52: 20080309 efficientalgorithms kulikov_lecture16

Задача о рюкзаке

ОпределениеЗадача о рюкзаке (knapsack problem) заключается в нахождении поданному набору из n предметов со стоимостями v1, . . . , vn и весамиw1, . . . , wn, а также общему весу W поднабора веса не более Wмаксимальной стоимости.

Алгоритм для рюкзака с повторениями

1 � K (w) — максимальная стоимость при весе не более w2 K (0) = 03 for w ← 1 to W4 do K (w)← max{K (w − wi ) + vi : wi ≤ w}5 return K (W )

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 19 / 40

Page 53: 20080309 efficientalgorithms kulikov_lecture16

Задача о рюкзаке

ОпределениеЗадача о рюкзаке (knapsack problem) заключается в нахождении поданному набору из n предметов со стоимостями v1, . . . , vn и весамиw1, . . . , wn, а также общему весу W поднабора веса не более Wмаксимальной стоимости.

Алгоритм для рюкзака с повторениями

1 � K (w) — максимальная стоимость при весе не более w2 K (0) = 03 for w ← 1 to W4 do K (w)← max{K (w − wi ) + vi : wi ≤ w}5 return K (W )

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 19 / 40

Page 54: 20080309 efficientalgorithms kulikov_lecture16

Рюкзак без повторений

Алгоритм для рюкзака без повторений

1 � K (w , j) — максимальная стоимость при весе не более wсреди первых j предметов

2 for all j , w3 do K (0, j) = K (w , 0) = 04 for j ← 1 to n5 do for w ← 1 to W6 do if wj > w7 then K (w , j)← K (w , j − 1)8 else K (w , j)← max{K (w , j − 1),

K (w − wj , j − 1) + vj}9 return K (W , n)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 20 / 40

Page 55: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

Запоминание

Как мы уже видели, реализация вычисления решения для задачипри помощи подзадач простой рекурсией может быть очень неэффективной по той причине, что одни и те же вычисления будутпроизводиться многократно.Можно, однако, избежать повторений в рекурсии.

Рекурсивный алгоритм для рюкзака с повторениями

Knapsack(w)

1 if w есть в хэш-таблице2 then return K (w)3 K (w)← max{K (w − wi ) + vi : wi ≤ w}4 добавить пару (w , K (w)) в хэш-таблицу5 return K (w)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40

Page 56: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

ЗапоминаниеКак мы уже видели, реализация вычисления решения для задачипри помощи подзадач простой рекурсией может быть очень неэффективной по той причине, что одни и те же вычисления будутпроизводиться многократно.

Можно, однако, избежать повторений в рекурсии.

Рекурсивный алгоритм для рюкзака с повторениями

Knapsack(w)

1 if w есть в хэш-таблице2 then return K (w)3 K (w)← max{K (w − wi ) + vi : wi ≤ w}4 добавить пару (w , K (w)) в хэш-таблицу5 return K (w)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40

Page 57: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

ЗапоминаниеКак мы уже видели, реализация вычисления решения для задачипри помощи подзадач простой рекурсией может быть очень неэффективной по той причине, что одни и те же вычисления будутпроизводиться многократно.Можно, однако, избежать повторений в рекурсии.

Рекурсивный алгоритм для рюкзака с повторениями

Knapsack(w)

1 if w есть в хэш-таблице2 then return K (w)3 K (w)← max{K (w − wi ) + vi : wi ≤ w}4 добавить пару (w , K (w)) в хэш-таблицу5 return K (w)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40

Page 58: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

ЗапоминаниеКак мы уже видели, реализация вычисления решения для задачипри помощи подзадач простой рекурсией может быть очень неэффективной по той причине, что одни и те же вычисления будутпроизводиться многократно.Можно, однако, избежать повторений в рекурсии.

Рекурсивный алгоритм для рюкзака с повторениями

Knapsack(w)

1 if w есть в хэш-таблице2 then return K (w)3 K (w)← max{K (w − wi ) + vi : wi ≤ w}4 добавить пару (w , K (w)) в хэш-таблицу5 return K (w)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40

Page 59: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

Запоминание

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40

Page 60: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

ЗапоминаниеДанный алгоритм не решает по несколько раз одну и ту жезадачу, но все-таки тратит какое-то лишнее время на рекурсивныевызовы.

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40

Page 61: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

ЗапоминаниеДанный алгоритм не решает по несколько раз одну и ту жезадачу, но все-таки тратит какое-то лишнее время на рекурсивныевызовы.Впрочем, такой трюк может иногда давать и выигрыш: методдинамическго программирования решает каждую подзадачу, в товремя как рекурсия с запоминанием решает только подзадачи,необходимые для вычисления конечного результата.

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40

Page 62: 20080309 efficientalgorithms kulikov_lecture16

Запоминание

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

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40

Page 63: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 23 / 40

Page 64: 20080309 efficientalgorithms kulikov_lecture16

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

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

Пусть нам нужно вычислить произведение A× B × C × D матрицразмера 50× 20, 20× 1, 1× 10, 10× 100, соответственно.Как известно, умножение матриц ассоциатвино, поэтому порядок,в котором мы будем перемножать, на результат никак не влияет.Он, однако, может повлиять на время, необходимое дляперемножения.Простое перемножение матриц размера m× n и n× p требует mnpумножений.

порядок количество перемноженийA× ((B × C )× D) 120 000(A× (B × C )× D) 60 000(A× B)× (C × D) 7 000

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40

Page 65: 20080309 efficientalgorithms kulikov_lecture16

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

Перемножение нескольких матрицПусть нам нужно вычислить произведение A× B × C × D матрицразмера 50× 20, 20× 1, 1× 10, 10× 100, соответственно.

Как известно, умножение матриц ассоциатвино, поэтому порядок,в котором мы будем перемножать, на результат никак не влияет.Он, однако, может повлиять на время, необходимое дляперемножения.Простое перемножение матриц размера m× n и n× p требует mnpумножений.

порядок количество перемноженийA× ((B × C )× D) 120 000(A× (B × C )× D) 60 000(A× B)× (C × D) 7 000

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40

Page 66: 20080309 efficientalgorithms kulikov_lecture16

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

Перемножение нескольких матрицПусть нам нужно вычислить произведение A× B × C × D матрицразмера 50× 20, 20× 1, 1× 10, 10× 100, соответственно.Как известно, умножение матриц ассоциатвино, поэтому порядок,в котором мы будем перемножать, на результат никак не влияет.

Он, однако, может повлиять на время, необходимое дляперемножения.Простое перемножение матриц размера m× n и n× p требует mnpумножений.

порядок количество перемноженийA× ((B × C )× D) 120 000(A× (B × C )× D) 60 000(A× B)× (C × D) 7 000

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40

Page 67: 20080309 efficientalgorithms kulikov_lecture16

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

Перемножение нескольких матрицПусть нам нужно вычислить произведение A× B × C × D матрицразмера 50× 20, 20× 1, 1× 10, 10× 100, соответственно.Как известно, умножение матриц ассоциатвино, поэтому порядок,в котором мы будем перемножать, на результат никак не влияет.Он, однако, может повлиять на время, необходимое дляперемножения.

Простое перемножение матриц размера m× n и n× p требует mnpумножений.

порядок количество перемноженийA× ((B × C )× D) 120 000(A× (B × C )× D) 60 000(A× B)× (C × D) 7 000

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40

Page 68: 20080309 efficientalgorithms kulikov_lecture16

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

Перемножение нескольких матрицПусть нам нужно вычислить произведение A× B × C × D матрицразмера 50× 20, 20× 1, 1× 10, 10× 100, соответственно.Как известно, умножение матриц ассоциатвино, поэтому порядок,в котором мы будем перемножать, на результат никак не влияет.Он, однако, может повлиять на время, необходимое дляперемножения.Простое перемножение матриц размера m× n и n× p требует mnpумножений.

порядок количество перемноженийA× ((B × C )× D) 120 000(A× (B × C )× D) 60 000(A× B)× (C × D) 7 000

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40

Page 69: 20080309 efficientalgorithms kulikov_lecture16

Представление порядков бинарными деревьями

A B

C

D

B C

D

A

B C

A

D

Количество таких деревьев экспоненциально.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 25 / 40

Page 70: 20080309 efficientalgorithms kulikov_lecture16

Представление порядков бинарными деревьями

A B

C

D

B C

D

A

B C

A

D

Количество таких деревьев экспоненциально.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 25 / 40

Page 71: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

Подзадачи

Ясно, что у оптимального дерева поддеревья также оптимальны.В каждом поддереве вычисляется произведение видаAi × Ai+1 × · · · × Aj .Пусть C (i , j) — минимальное количество умножений, необходимыхдля вычисления Ai × Ai+1 × · · · × Aj .Тогда C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40

Page 72: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

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

В каждом поддереве вычисляется произведение видаAi × Ai+1 × · · · × Aj .Пусть C (i , j) — минимальное количество умножений, необходимыхдля вычисления Ai × Ai+1 × · · · × Aj .Тогда C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40

Page 73: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиЯсно, что у оптимального дерева поддеревья также оптимальны.В каждом поддереве вычисляется произведение видаAi × Ai+1 × · · · × Aj .

Пусть C (i , j) — минимальное количество умножений, необходимыхдля вычисления Ai × Ai+1 × · · · × Aj .Тогда C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40

Page 74: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиЯсно, что у оптимального дерева поддеревья также оптимальны.В каждом поддереве вычисляется произведение видаAi × Ai+1 × · · · × Aj .Пусть C (i , j) — минимальное количество умножений, необходимыхдля вычисления Ai × Ai+1 × · · · × Aj .

Тогда C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40

Page 75: 20080309 efficientalgorithms kulikov_lecture16

Подзадачи

ПодзадачиЯсно, что у оптимального дерева поддеревья также оптимальны.В каждом поддереве вычисляется произведение видаAi × Ai+1 × · · · × Aj .Пусть C (i , j) — минимальное количество умножений, необходимыхдля вычисления Ai × Ai+1 × · · · × Aj .Тогда C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40

Page 76: 20080309 efficientalgorithms kulikov_lecture16

Алгоритм

Алгоритм

1 for i ← 1 to n2 do C (i , i) = 03 for s ← 1 to n − 14 do for i ← 1 to n − s � s — размер подзадачи5 do j = i + s6 C (i , j) = mini≤k<j{C (i , k) + C (k + 1, j) + mi−1 ·mk ·mj}7 return C (1, n)

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 27 / 40

Page 77: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 28 / 40

Page 78: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 29 / 40

Page 79: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие надежные пути

ОпределениеЗадача о кратчайшем надежном пути (shortest reliable path problem)заключается в нахождении по данному взвешенному графу с двумявыделенными вершинами s и t, а также числу k кратчайшего пути изs в t, состоящего не более чем из k ребер.

ПодзадачиПодзадачи нужно выбрать так, чтобы каким-нибудь образомзапоминалась информация о длине пути.dist(v , i) есть длина кратчайшего пути, состоящего ровно из iребер, из s в vdist(v , i) = min(u,v)∈E{dist(u, i − 1) + l(u, v)}

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40

Page 80: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие надежные пути

ОпределениеЗадача о кратчайшем надежном пути (shortest reliable path problem)заключается в нахождении по данному взвешенному графу с двумявыделенными вершинами s и t, а также числу k кратчайшего пути изs в t, состоящего не более чем из k ребер.

Подзадачи

Подзадачи нужно выбрать так, чтобы каким-нибудь образомзапоминалась информация о длине пути.dist(v , i) есть длина кратчайшего пути, состоящего ровно из iребер, из s в vdist(v , i) = min(u,v)∈E{dist(u, i − 1) + l(u, v)}

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40

Page 81: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие надежные пути

ОпределениеЗадача о кратчайшем надежном пути (shortest reliable path problem)заключается в нахождении по данному взвешенному графу с двумявыделенными вершинами s и t, а также числу k кратчайшего пути изs в t, состоящего не более чем из k ребер.

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

dist(v , i) есть длина кратчайшего пути, состоящего ровно из iребер, из s в vdist(v , i) = min(u,v)∈E{dist(u, i − 1) + l(u, v)}

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40

Page 82: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие надежные пути

ОпределениеЗадача о кратчайшем надежном пути (shortest reliable path problem)заключается в нахождении по данному взвешенному графу с двумявыделенными вершинами s и t, а также числу k кратчайшего пути изs в t, состоящего не более чем из k ребер.

ПодзадачиПодзадачи нужно выбрать так, чтобы каким-нибудь образомзапоминалась информация о длине пути.dist(v , i) есть длина кратчайшего пути, состоящего ровно из iребер, из s в v

dist(v , i) = min(u,v)∈E{dist(u, i − 1) + l(u, v)}

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40

Page 83: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие надежные пути

ОпределениеЗадача о кратчайшем надежном пути (shortest reliable path problem)заключается в нахождении по данному взвешенному графу с двумявыделенными вершинами s и t, а также числу k кратчайшего пути изs в t, состоящего не более чем из k ребер.

ПодзадачиПодзадачи нужно выбрать так, чтобы каким-нибудь образомзапоминалась информация о длине пути.dist(v , i) есть длина кратчайшего пути, состоящего ровно из iребер, из s в vdist(v , i) = min(u,v)∈E{dist(u, i − 1) + l(u, v)}

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40

Page 84: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 31 / 40

Page 85: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути между всеми парами вершин графа

ОпределениеЗадача о кратчайших путях между всеми парами вершин (all-pairsshortest paths problem) заключается в нахождении по данномувзвешенному графу кратчайших расстояний между всеми парамивершин. Предполагаем, что граф не содержит циклов отрицательноговеса.

Подзадачиdist(i , j , k) — длина кратчайшего пути из i в j , все промежуточныевершины которого принадлежат множеству {1, . . . , k}.dist(i , j , k) = min{dist(i , k , k − 1) + dist(k , j , k − 1), dist(i , j , k − 1)}Время работы соответствующего алгоритма — O(|V |3).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40

Page 86: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути между всеми парами вершин графа

ОпределениеЗадача о кратчайших путях между всеми парами вершин (all-pairsshortest paths problem) заключается в нахождении по данномувзвешенному графу кратчайших расстояний между всеми парамивершин. Предполагаем, что граф не содержит циклов отрицательноговеса.

Подзадачи

dist(i , j , k) — длина кратчайшего пути из i в j , все промежуточныевершины которого принадлежат множеству {1, . . . , k}.dist(i , j , k) = min{dist(i , k , k − 1) + dist(k , j , k − 1), dist(i , j , k − 1)}Время работы соответствующего алгоритма — O(|V |3).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40

Page 87: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути между всеми парами вершин графа

ОпределениеЗадача о кратчайших путях между всеми парами вершин (all-pairsshortest paths problem) заключается в нахождении по данномувзвешенному графу кратчайших расстояний между всеми парамивершин. Предполагаем, что граф не содержит циклов отрицательноговеса.

Подзадачиdist(i , j , k) — длина кратчайшего пути из i в j , все промежуточныевершины которого принадлежат множеству {1, . . . , k}.

dist(i , j , k) = min{dist(i , k , k − 1) + dist(k , j , k − 1), dist(i , j , k − 1)}Время работы соответствующего алгоритма — O(|V |3).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40

Page 88: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути между всеми парами вершин графа

ОпределениеЗадача о кратчайших путях между всеми парами вершин (all-pairsshortest paths problem) заключается в нахождении по данномувзвешенному графу кратчайших расстояний между всеми парамивершин. Предполагаем, что граф не содержит циклов отрицательноговеса.

Подзадачиdist(i , j , k) — длина кратчайшего пути из i в j , все промежуточныевершины которого принадлежат множеству {1, . . . , k}.dist(i , j , k) = min{dist(i , k , k − 1) + dist(k , j , k − 1), dist(i , j , k − 1)}

Время работы соответствующего алгоритма — O(|V |3).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40

Page 89: 20080309 efficientalgorithms kulikov_lecture16

Кратчайшие пути между всеми парами вершин графа

ОпределениеЗадача о кратчайших путях между всеми парами вершин (all-pairsshortest paths problem) заключается в нахождении по данномувзвешенному графу кратчайших расстояний между всеми парамивершин. Предполагаем, что граф не содержит циклов отрицательноговеса.

Подзадачиdist(i , j , k) — длина кратчайшего пути из i в j , все промежуточныевершины которого принадлежат множеству {1, . . . , k}.dist(i , j , k) = min{dist(i , k , k − 1) + dist(k , j , k − 1), dist(i , j , k − 1)}Время работы соответствующего алгоритма — O(|V |3).

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40

Page 90: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 33 / 40

Page 91: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

ЗамечанияКоличество различных циклов равно (n − 1)!.Естественной подзадачей в данном случае является начальнаячасть цикла.Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 92: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

Замечания

Количество различных циклов равно (n − 1)!.Естественной подзадачей в данном случае является начальнаячасть цикла.Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 93: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

ЗамечанияКоличество различных циклов равно (n − 1)!.

Естественной подзадачей в данном случае является начальнаячасть цикла.Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 94: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

ЗамечанияКоличество различных циклов равно (n − 1)!.Естественной подзадачей в данном случае является начальнаячасть цикла.

Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 95: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

ЗамечанияКоличество различных циклов равно (n − 1)!.Естественной подзадачей в данном случае является начальнаячасть цикла.Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.

Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 96: 20080309 efficientalgorithms kulikov_lecture16

Задача о коммивояжере

ОпределениеЗадача о коммивояжере (traveling salesman problem) заключается внахождении по данному полному взвешенному графу гамильтоновацикла минимальной стоимости.

ЗамечанияКоличество различных циклов равно (n − 1)!.Естественной подзадачей в данном случае является начальнаячасть цикла.Об этой начальной части мы должны знать её последнюювершину и множество внутренних вершин.Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 ивершины j ∈ S C (S , j) есть длина кратчайшего пути,начинающегося в вершине 1, заканчивающегося в вершине j ипроходящего ровно по разу все вершины множества S .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40

Page 97: 20080309 efficientalgorithms kulikov_lecture16

АлгоритмАлгоритм

TSP(G )

1 C ({1}, 1) = 02 for s ← 2 to n3 do for S ⊆ {1, 2, . . . , n}, таких что |S | = s и 1 ∈ S4 do C (S , 1) =∞5 for j ∈ S , j ̸= 16 do C (S , j) = mini∈S ,i ̸=j{C (S ∖ {j}, i) + di ,j}7 return minj C ({1, . . . , n}, j) + dj1

Время работыВремя работы алгоритма есть O(n22n). Полученный алгоритм хоть игораздо быстрее полного перебора, но все же совершенно бесполезенна практике: экспоненциально не только время работы, но еще ипамять.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 35 / 40

Page 98: 20080309 efficientalgorithms kulikov_lecture16

АлгоритмАлгоритм

TSP(G )

1 C ({1}, 1) = 02 for s ← 2 to n3 do for S ⊆ {1, 2, . . . , n}, таких что |S | = s и 1 ∈ S4 do C (S , 1) =∞5 for j ∈ S , j ̸= 16 do C (S , j) = mini∈S ,i ̸=j{C (S ∖ {j}, i) + di ,j}7 return minj C ({1, . . . , n}, j) + dj1

Время работыВремя работы алгоритма есть O(n22n). Полученный алгоритм хоть игораздо быстрее полного перебора, но все же совершенно бесполезенна практике: экспоненциально не только время работы, но еще ипамять.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 35 / 40

Page 99: 20080309 efficientalgorithms kulikov_lecture16

План лекции

1 Введение

2 Наибольшая возрастающая подпоследовательность

3 Стоимость редактирования

4 Задача о рюкзаке

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

6 Кратчайшие путиКратчайшие надежные путиКратчайшие пути между всеми парами вершин графаЗадача о коммивояжере

7 Независимые множества в деревьях

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 36 / 40

Page 100: 20080309 efficientalgorithms kulikov_lecture16

Независимые множества в деревьях

ОпределениеЗадача о максимальном независимом множестве (independent setproblem) заключается в нахождении по данному графу множествапопарно не соединенных ребрами вершин максимального размера.

ИдеиВ общем случае задача NP-трудна, но если входной графявляется деревом, то может быть решена за линейное время.Пусть I (u) — размер максимального независимого множества вподдереве с корнем в u.

I (u) = max{︁

1 +∑︀

w — внук u I (w),∑︀

w — сын u I (w)}︁

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40

Page 101: 20080309 efficientalgorithms kulikov_lecture16

Независимые множества в деревьях

ОпределениеЗадача о максимальном независимом множестве (independent setproblem) заключается в нахождении по данному графу множествапопарно не соединенных ребрами вершин максимального размера.

Идеи

В общем случае задача NP-трудна, но если входной графявляется деревом, то может быть решена за линейное время.Пусть I (u) — размер максимального независимого множества вподдереве с корнем в u.

I (u) = max{︁

1 +∑︀

w — внук u I (w),∑︀

w — сын u I (w)}︁

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40

Page 102: 20080309 efficientalgorithms kulikov_lecture16

Независимые множества в деревьях

ОпределениеЗадача о максимальном независимом множестве (independent setproblem) заключается в нахождении по данному графу множествапопарно не соединенных ребрами вершин максимального размера.

ИдеиВ общем случае задача NP-трудна, но если входной графявляется деревом, то может быть решена за линейное время.

Пусть I (u) — размер максимального независимого множества вподдереве с корнем в u.

I (u) = max{︁

1 +∑︀

w — внук u I (w),∑︀

w — сын u I (w)}︁

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40

Page 103: 20080309 efficientalgorithms kulikov_lecture16

Независимые множества в деревьях

ОпределениеЗадача о максимальном независимом множестве (independent setproblem) заключается в нахождении по данному графу множествапопарно не соединенных ребрами вершин максимального размера.

ИдеиВ общем случае задача NP-трудна, но если входной графявляется деревом, то может быть решена за линейное время.Пусть I (u) — размер максимального независимого множества вподдереве с корнем в u.

I (u) = max{︁

1 +∑︀

w — внук u I (w),∑︀

w — сын u I (w)}︁

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40

Page 104: 20080309 efficientalgorithms kulikov_lecture16

Независимые множества в деревьях

ОпределениеЗадача о максимальном независимом множестве (independent setproblem) заключается в нахождении по данному графу множествапопарно не соединенных ребрами вершин максимального размера.

ИдеиВ общем случае задача NP-трудна, но если входной графявляется деревом, то может быть решена за линейное время.Пусть I (u) — размер максимального независимого множества вподдереве с корнем в u.

I (u) = max{︁

1 +∑︀

w — внук u I (w),∑︀

w — сын u I (w)}︁

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40

Page 105: 20080309 efficientalgorithms kulikov_lecture16

Об используемой памяти

Об используемой памяти

Как правило, время работы алгоритма, основанного на методединамического программирования, равно количеству вершин всоответствующем графе.Ясно, что объема памяти, пропорционального количеству вершин,будет достаточно, но иногда можно обойтись и меньшим объемом.Например, если для подсчета значения dist(·, ·, k + 1) необходимытолько значения dist(·, ·, k), то нет никакой небходимости вкаждый момент хранить значения для всех k .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40

Page 106: 20080309 efficientalgorithms kulikov_lecture16

Об используемой памяти

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

Ясно, что объема памяти, пропорционального количеству вершин,будет достаточно, но иногда можно обойтись и меньшим объемом.Например, если для подсчета значения dist(·, ·, k + 1) необходимытолько значения dist(·, ·, k), то нет никакой небходимости вкаждый момент хранить значения для всех k .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40

Page 107: 20080309 efficientalgorithms kulikov_lecture16

Об используемой памяти

Об используемой памятиКак правило, время работы алгоритма, основанного на методединамического программирования, равно количеству вершин всоответствующем графе.Ясно, что объема памяти, пропорционального количеству вершин,будет достаточно, но иногда можно обойтись и меньшим объемом.

Например, если для подсчета значения dist(·, ·, k + 1) необходимытолько значения dist(·, ·, k), то нет никакой небходимости вкаждый момент хранить значения для всех k .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40

Page 108: 20080309 efficientalgorithms kulikov_lecture16

Об используемой памяти

Об используемой памятиКак правило, время работы алгоритма, основанного на методединамического программирования, равно количеству вершин всоответствующем графе.Ясно, что объема памяти, пропорционального количеству вершин,будет достаточно, но иногда можно обойтись и меньшим объемом.Например, если для подсчета значения dist(·, ·, k + 1) необходимытолько значения dist(·, ·, k), то нет никакой небходимости вкаждый момент хранить значения для всех k .

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40

Page 109: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

Что мы узнали за сегодня?

Метод динамического программирования применим тогда, когдарешение задачи сводится к решению нескольких более простыхперекрывающихся задач.Основным моментом метода является определение подзадач испособа построения решения из решений для более простых задач.По задаче, таким образом, строится ориентированныйациклический граф.Время работы, как правило, равно количеству вершин этогографа.Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 110: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

Что мы узнали за сегодня?Метод динамического программирования применим тогда, когдарешение задачи сводится к решению нескольких более простыхперекрывающихся задач.

Основным моментом метода является определение подзадач испособа построения решения из решений для более простых задач.По задаче, таким образом, строится ориентированныйациклический граф.Время работы, как правило, равно количеству вершин этогографа.Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 111: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

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

По задаче, таким образом, строится ориентированныйациклический граф.Время работы, как правило, равно количеству вершин этогографа.Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 112: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

Что мы узнали за сегодня?Метод динамического программирования применим тогда, когдарешение задачи сводится к решению нескольких более простыхперекрывающихся задач.Основным моментом метода является определение подзадач испособа построения решения из решений для более простых задач.По задаче, таким образом, строится ориентированныйациклический граф.

Время работы, как правило, равно количеству вершин этогографа.Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 113: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

Что мы узнали за сегодня?Метод динамического программирования применим тогда, когдарешение задачи сводится к решению нескольких более простыхперекрывающихся задач.Основным моментом метода является определение подзадач испособа построения решения из решений для более простых задач.По задаче, таким образом, строится ориентированныйациклический граф.Время работы, как правило, равно количеству вершин этогографа.

Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 114: 20080309 efficientalgorithms kulikov_lecture16

Что мы узнали за сегодня?

Что мы узнали за сегодня?Метод динамического программирования применим тогда, когдарешение задачи сводится к решению нескольких более простыхперекрывающихся задач.Основным моментом метода является определение подзадач испособа построения решения из решений для более простых задач.По задаче, таким образом, строится ориентированныйациклический граф.Время работы, как правило, равно количеству вершин этогографа.Используемая память может быть и меньше.

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40

Page 115: 20080309 efficientalgorithms kulikov_lecture16

Спасибо за внимание!

А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 40 / 40