SlideShare a Scribd company logo
1 of 115
Download to read offline
с/к “Эффективные алгоритмы”
          Лекция 16: Динамическое программирование

                                         А. Куликов

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




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

1   Введение




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

1   Введение

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




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

1   Введение

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

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




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

1   Введение

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

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

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




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

1   Введение

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

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

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

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




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

1   Введение

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

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

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

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

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




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

1   Введение

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

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

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

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

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

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


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

1   Введение

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

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

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

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

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

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


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

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




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

Кратчайшие пути в направленных ациклических графах
      Рассмотрим направленный ациклический направленный граф.
                                                a   6
                                                        b
                                        1                       2
                                    s           4       1           e
                                            2               1
                                                c   3
                                                        d




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

Кратчайшие пути в направленных ациклических графах
      Рассмотрим направленный ациклический направленный граф.
                                                a   6
                                                        b
                                        1                       2
                                    s           4       1           e
                                            2               1
                                                c   3
                                                        d


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


                          s     2   c    4      a   6       1           1   e
                                                        b           d
                                    1                               2




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

Кратчайшие пути в направленных ациклических графах
      Рассмотрим направленный ациклический направленный граф.
                                                a   6
                                                        b
                                        1                       2
                                    s           4       1           e
                                            2               1
                                                c   3
                                                        d


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


                          s     2   c    4      a   6       1           1   e
                                                        b           d
                                    1                               2


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



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

Кратчайшие пути в направленных ациклических графах
      Рассмотрим направленный ациклический направленный граф.
                                                a   6
                                                        b
                                        1                       2
                                    s           4       1           e
                                            2               1
                                                c   3
                                                        d


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


                          s     2   c    4      a   6       1           1   e
                                                        b           d
                                    1                               2


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

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

Алгоритм

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




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

Алгоритм

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

Замечание




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

Алгоритм

DAG-Shortest-Paths(G , s)
1 инициализировать все значения массива dist значением ∞
2 dist(s) = 0
3 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
Кратчайшие пути в направленных ациклических графах

Алгоритм

DAG-Shortest-Paths(G , s)
1 инициализировать все значения массива dist значением ∞
2 dist(s) = 0
3 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
Динамическое программирование



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




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



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




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



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




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

1   Введение

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

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

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

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

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

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


А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   7 / 40
Наибольшая возрастающая подпоследовательность
Определение
Задача о наибольшей возрастающей последовательности (longest
increasing subsequence problem) заключается в нахождении по данной
последовательности её возрастающей подпоследовательности
максимальной длины.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   8 / 40
Наибольшая возрастающая подпоследовательность
Определение
Задача о наибольшей возрастающей последовательности (longest
increasing subsequence problem) заключается в нахождении по данной
последовательности её возрастающей подпоследовательности
максимальной длины.

Пример




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   8 / 40
Наибольшая возрастающая подпоследовательность
Определение
Задача о наибольшей возрастающей последовательности (longest
increasing subsequence problem) заключается в нахождении по данной
последовательности её возрастающей подпоследовательности
максимальной длины.

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



                 5        2         8         6        3            6   9   7




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование               8 / 40
Наибольшая возрастающая подпоследовательность
Определение
Задача о наибольшей возрастающей последовательности (longest
increasing subsequence problem) заключается в нахождении по данной
последовательности её возрастающей подпоследовательности
максимальной длины.

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



                 5        2         8         6        3            6   9   7




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



Алгоритм

1 for j ← 1 to n
2       do L(j) ← 1 + max{L(i) : (i, j) ∈ E }
3          £ L(j) — длина максимальной последовательности,
           заканчивающейся в j-м элементе
4 return maxj L(j)




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


Замечания




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


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




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


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




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


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




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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   11 / 40
Рекурсия и динамическое программирование
Рекурсия и динамическое программирование
      Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование       11 / 40
Рекурсия и динамическое программирование
Рекурсия и динамическое программирование
      Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.
                                              L(4)


                      L(1)                    L(2)                    L(3)


                                              L(1)                  L(1) L(2)


                                                                         L(1)




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование               11 / 40
Рекурсия и динамическое программирование
Рекурсия и динамическое программирование
      Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}.
                                              L(4)


                      L(1)                    L(2)                    L(3)


                                              L(1)                  L(1) L(2)


                                                                         L(1)

      Эффективность динамического программирования достигается,
      таким образом, за счет разумного перечисления подзадач и
      порядка на них.
А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование               11 / 40
План лекции

1   Введение

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

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

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

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

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

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


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


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




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


Определение
Задача о стоимости редактирования (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
Подзадачи

Подзадачи




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

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




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

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




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

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




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

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




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

Подзадачи
      Важным моментом динамического программирования является
      выбор подзадач.
      Нам нужно найти стоимость редактирования строчек 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)}.




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

Подзадачи
      Важным моментом динамического программирования является
      выбор подзадач.
      Нам нужно найти стоимость редактирования строчек 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
Алгоритм


Алгоритм

1 for i ← 0 to m
2       do E (i, 0) = i
3 for j ← 0 to n
4       do E (0, j) = j
5 for i ← 1 to m
6       do for j ← 1 to n
7                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
Соответствующий граф
                                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
Соответствующий граф
                                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
Соответствующий граф
                                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
Стандартные способы выбора подзадач



Стандартные способы выбора подзадач
                  вход                                подзадача
                  x1 , . . . , xn                     x1 , . . . , xi
                  x1 , . . . , xn и y1 , . . . , ym   x1 , . . . , xi и y1 , . . . , yj
                  x1 , . . . , xn                     xi , . . . , xj
                  дерево                              поддерево




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

1   Введение

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

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

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

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

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

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


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

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




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

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

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

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


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

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

1 £ K (w , j) — максимальная стоимость при весе не более w
  среди первых j предметов
2 for all j, w
3       do K (0, j) = K (w , 0) = 0
4 for j ← 1 to n
5       do for w ← 1 to W
6               do if wj > w
7                     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
Запоминание
Запоминание




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




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




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

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

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
Запоминание

Запоминание




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

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




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

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




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

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


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

1   Введение

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

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

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

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

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

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


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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   24 / 40
Перемножение нескольких матриц
Перемножение нескольких матриц
      Пусть нам нужно вычислить произведение A × B × C × D матриц
      размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   24 / 40
Перемножение нескольких матриц
Перемножение нескольких матриц
      Пусть нам нужно вычислить произведение A × B × C × D матриц
      размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно.
      Как известно, умножение матриц ассоциатвино, поэтому порядок,
      в котором мы будем перемножать, на результат никак не влияет.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   24 / 40
Перемножение нескольких матриц
Перемножение нескольких матриц
      Пусть нам нужно вычислить произведение A × B × C × D матриц
      размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно.
      Как известно, умножение матриц ассоциатвино, поэтому порядок,
      в котором мы будем перемножать, на результат никак не влияет.
      Он, однако, может повлиять на время, необходимое для
      перемножения.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   24 / 40
Перемножение нескольких матриц
Перемножение нескольких матриц
      Пусть нам нужно вычислить произведение 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
Представление порядков бинарными деревьями




                           D              A                                 D


                       C                                D           A


         A        B                       B         C                   B   C




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




                           D              A                             D


                       C                                D           A


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




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



Подзадачи




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



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




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



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




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



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




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



Подзадачи
      Ясно, что у оптимального дерева поддеревья также оптимальны.
      В каждом поддереве вычисляется произведение вида
      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
Алгоритм


Алгоритм


1 for i ← 1 to n
2       do C (i, i) = 0
3 for s ← 1 to n − 1
4       do for i ← 1 to n − s £ s — размер подзадачи
5                do j = i + s
6                    C (i, j) = mini≤k<j {C (i, k) + C (k + 1, j) + mi−1 · mk · m
7 return C (1, n)




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

1   Введение

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

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

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

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

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

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


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

1   Введение

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

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

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

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

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

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


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

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




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

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

Подзадачи




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

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

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




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

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

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




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

Определение
Задача о кратчайшем надежном пути (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
План лекции

1   Введение

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

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

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

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

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

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


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

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




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

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

Подзадачи




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

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

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




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

Определение
Задача о кратчайших путях между всеми парами вершин (all-pairs
shortest 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)}




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

Определение
Задача о кратчайших путях между всеми парами вершин (all-pairs
shortest 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
План лекции

1   Введение

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

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

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

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

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

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


А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   33 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   34 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.

Замечания




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   34 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   34 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   34 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   34 / 40
Задача о коммивояжере
Определение
Задача о коммивояжере (traveling salesman problem) заключается в
нахождении по данному полному взвешенному графу гамильтонова
цикла минимальной стоимости.

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

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




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

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

Время работы
Время работы алгоритма есть O(n2 2n ). Полученный алгоритм хоть и
гораздо быстрее полного перебора, но все же совершенно бесполезен
на практике: экспоненциально не только время работы, но еще и
память.
А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование               35 / 40
План лекции

1   Введение

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

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

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

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

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

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


А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   36 / 40
Независимые множества в деревьях

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   37 / 40
Независимые множества в деревьях

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

Идеи




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   37 / 40
Независимые множества в деревьях

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

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   37 / 40
Независимые множества в деревьях

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

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




А. Куликов (CS клуб при ПОМИ)   16. Динамическое программирование   37 / 40
Независимые множества в деревьях

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

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




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


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




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


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




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


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




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


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




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


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




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


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




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


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




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


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




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


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




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


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



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




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

More Related Content

Viewers also liked

Fangnawa Experience Midi libre
Fangnawa Experience Midi libreFangnawa Experience Midi libre
Fangnawa Experience Midi libreKris Supa
 
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...KISK FF MU
 
Curriculum vitae rise
Curriculum vitae riseCurriculum vitae rise
Curriculum vitae risefelixjvalles
 
Презентация EDUkIT
Презентация EDUkITПрезентация EDUkIT
Презентация EDUkITDialogWebdesign
 
Jiří Knesl: Souboj frameworků
Jiří Knesl: Souboj frameworkůJiří Knesl: Souboj frameworků
Jiří Knesl: Souboj frameworkůWebExpo
 
Formato articulos-ieee 1-leiman macias
Formato articulos-ieee  1-leiman maciasFormato articulos-ieee  1-leiman macias
Formato articulos-ieee 1-leiman maciasLeiman Delgan
 
Prezentace projektu Masarykův onkologický ústav
Prezentace projektu Masarykův onkologický ústavPrezentace projektu Masarykův onkologický ústav
Prezentace projektu Masarykův onkologický ústavKISK FF MU
 
One piece volume 11(091-099)
One piece volume 11(091-099)One piece volume 11(091-099)
One piece volume 11(091-099)Marcos Donato
 
Data Never Sleeps 2.0
Data Never Sleeps 2.0Data Never Sleeps 2.0
Data Never Sleeps 2.0Domo
 
Освенцим одно из самых печальных мест на лице нашей земли
Освенцим   одно из самых печальных мест на лице нашей землиОсвенцим   одно из самых печальных мест на лице нашей земли
Освенцим одно из самых печальных мест на лице нашей землиzalcman96
 
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikar
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas KashalikarSahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikar
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikarshivsr5
 

Viewers also liked (20)

Fangnawa Experience Midi libre
Fangnawa Experience Midi libreFangnawa Experience Midi libre
Fangnawa Experience Midi libre
 
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...
Metoda orální historie se zaměřením na archivaci rozhovorů a její aplikace v ...
 
Welcome
WelcomeWelcome
Welcome
 
Cyberbullyng afiche
Cyberbullyng aficheCyberbullyng afiche
Cyberbullyng afiche
 
Curriculum vitae rise
Curriculum vitae riseCurriculum vitae rise
Curriculum vitae rise
 
Презентация EDUkIT
Презентация EDUkITПрезентация EDUkIT
Презентация EDUkIT
 
Examen nacional 301135_220
Examen nacional 301135_220Examen nacional 301135_220
Examen nacional 301135_220
 
Jiří Knesl: Souboj frameworků
Jiří Knesl: Souboj frameworkůJiří Knesl: Souboj frameworků
Jiří Knesl: Souboj frameworků
 
Ladder div 1 & div 2 as at 5 5 2014
Ladder div 1 & div 2 as at 5 5 2014Ladder div 1 & div 2 as at 5 5 2014
Ladder div 1 & div 2 as at 5 5 2014
 
Formato articulos-ieee 1-leiman macias
Formato articulos-ieee  1-leiman maciasFormato articulos-ieee  1-leiman macias
Formato articulos-ieee 1-leiman macias
 
Prezentace projektu Masarykův onkologický ústav
Prezentace projektu Masarykův onkologický ústavPrezentace projektu Masarykův onkologický ústav
Prezentace projektu Masarykův onkologický ústav
 
One piece volume 11(091-099)
One piece volume 11(091-099)One piece volume 11(091-099)
One piece volume 11(091-099)
 
Sharebrary
SharebrarySharebrary
Sharebrary
 
Spring Capitulo 04
Spring Capitulo 04Spring Capitulo 04
Spring Capitulo 04
 
Sopas de letras varias
Sopas de letras variasSopas de letras varias
Sopas de letras varias
 
Data Never Sleeps 2.0
Data Never Sleeps 2.0Data Never Sleeps 2.0
Data Never Sleeps 2.0
 
pasos para Twitter
pasos para Twitterpasos para Twitter
pasos para Twitter
 
Освенцим одно из самых печальных мест на лице нашей земли
Освенцим   одно из самых печальных мест на лице нашей землиОсвенцим   одно из самых печальных мест на лице нашей земли
Освенцим одно из самых печальных мест на лице нашей земли
 
Trabajo Ciberbullying
Trabajo CiberbullyingTrabajo Ciberbullying
Trabajo Ciberbullying
 
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikar
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas KashalikarSahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikar
Sahastranetra A Bestseller On Vishnusahasranam Dr. Shriniwas Kashalikar
 

More from Computer Science Club

20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugsComputer Science Club
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugsComputer Science Club
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12Computer Science Club
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11Computer Science Club
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10Computer Science Club
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09Computer Science Club
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02Computer Science Club
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01Computer Science Club
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04Computer Science Club
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01Computer Science Club
 

More from Computer Science Club (20)

20141223 kuznetsov distributed
20141223 kuznetsov distributed20141223 kuznetsov distributed
20141223 kuznetsov distributed
 
Computer Vision
Computer VisionComputer Vision
Computer Vision
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs20140531 serebryany lecture02_find_scary_cpp_bugs
20140531 serebryany lecture02_find_scary_cpp_bugs
 
20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs20140531 serebryany lecture01_fantastic_cpp_bugs
20140531 serebryany lecture01_fantastic_cpp_bugs
 
20140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture1220140511 parallel programming_kalishenko_lecture12
20140511 parallel programming_kalishenko_lecture12
 
20140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture1120140427 parallel programming_zlobin_lecture11
20140427 parallel programming_zlobin_lecture11
 
20140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture1020140420 parallel programming_kalishenko_lecture10
20140420 parallel programming_kalishenko_lecture10
 
20140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture0920140413 parallel programming_kalishenko_lecture09
20140413 parallel programming_kalishenko_lecture09
 
20140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture0220140329 graph drawing_dainiak_lecture02
20140329 graph drawing_dainiak_lecture02
 
20140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture0120140329 graph drawing_dainiak_lecture01
20140329 graph drawing_dainiak_lecture01
 
20140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-0420140310 parallel programming_kalishenko_lecture03-04
20140310 parallel programming_kalishenko_lecture03-04
 
20140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-0320140223-SuffixTrees-lecture01-03
20140223-SuffixTrees-lecture01-03
 
20140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture0120140216 parallel programming_kalishenko_lecture01
20140216 parallel programming_kalishenko_lecture01
 
20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich20131106 h10 lecture6_matiyasevich
20131106 h10 lecture6_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich20131027 h10 lecture5_matiyasevich
20131027 h10 lecture5_matiyasevich
 
20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich20131013 h10 lecture4_matiyasevich
20131013 h10 lecture4_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 
20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich20131006 h10 lecture3_matiyasevich
20131006 h10 lecture3_matiyasevich
 

20080309 efficientalgorithms kulikov_lecture16

  • 1. с/к “Эффективные алгоритмы” Лекция 16: Динамическое программирование А. Куликов Computer Science клуб при ПОМИ http://logic.pdmi.ras.ru/∼infclub/ А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 1 / 40
  • 2. План лекции 1 Введение А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 3. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 4. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 5. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 6. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 7. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 8. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 2 / 40
  • 9. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 3 / 40
  • 10. Кратчайшие пути в направленных ациклических графах Кратчайшие пути в направленных ациклических графах А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40
  • 11. Кратчайшие пути в направленных ациклических графах Кратчайшие пути в направленных ациклических графах Рассмотрим направленный ациклический направленный граф. a 6 b 1 2 s 4 1 e 2 1 c 3 d А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40
  • 12. Кратчайшие пути в направленных ациклических графах Кратчайшие пути в направленных ациклических графах Рассмотрим направленный ациклический направленный граф. a 6 b 1 2 s 4 1 e 2 1 c 3 d Важным свойством такого графа является наличие топологической сортировки его вершин. 3 s 2 c 4 a 6 1 1 e b d 1 2 А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40
  • 13. Кратчайшие пути в направленных ациклических графах Кратчайшие пути в направленных ациклических графах Рассмотрим направленный ациклический направленный граф. a 6 b 1 2 s 4 1 e 2 1 c 3 d Важным свойством такого графа является наличие топологической сортировки его вершин. 3 s 2 c 4 a 6 1 1 e b d 1 2 Допустим, мы хотим найти длину кратчайшего пути от вершины s до вершины d . А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40
  • 14. Кратчайшие пути в направленных ациклических графах Кратчайшие пути в направленных ациклических графах Рассмотрим направленный ациклический направленный граф. a 6 b 1 2 s 4 1 e 2 1 c 3 d Важным свойством такого графа является наличие топологической сортировки его вершин. 3 s 2 c 4 a 6 1 1 e b d 1 2 Допустим, мы хотим найти длину кратчайшего пути от вершины s до вершины d . Ясно, что dist(d ) = min{dist(b) + 1, dist(c) + 3}. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 4 / 40
  • 15. Кратчайшие пути в направленных ациклических графах Алгоритм DAG-Shortest-Paths(G , s) 1 инициализировать все значения массива dist значением ∞ 2 dist(s) = 0 3 for v ∈ V ∖ {s} в топологической сортировке вершин 4 do dist(v ) = min(u,v )∈E {dist(u) + d (u, v )} А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40
  • 16. Кратчайшие пути в направленных ациклических графах Алгоритм DAG-Shortest-Paths(G , s) 1 инициализировать все значения массива dist значением ∞ 2 dist(s) = 0 3 for v ∈ V ∖ {s} в топологической сортировке вершин 4 do dist(v ) = min(u,v )∈E {dist(u) + d (u, v )} Замечание А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 5 / 40
  • 17. Кратчайшие пути в направленных ациклических графах Алгоритм DAG-Shortest-Paths(G , s) 1 инициализировать все значения массива dist значением ∞ 2 dist(s) = 0 3 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
  • 18. Кратчайшие пути в направленных ациклических графах Алгоритм DAG-Shortest-Paths(G , s) 1 инициализировать все значения массива dist значением ∞ 2 dist(s) = 0 3 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
  • 19. Динамическое программирование Динамическое программирование А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40
  • 20. Динамическое программирование Динамическое программирование Динамическое программирование решает задачу, разбивая её на подзадачи и решая их от простых к сложным, периодически используя ответы для уже решенных подзадач. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40
  • 21. Динамическое программирование Динамическое программирование Динамическое программирование решает задачу, разбивая её на подзадачи и решая их от простых к сложным, периодически используя ответы для уже решенных подзадач. Подзадачи образуют направленный ациклический граф: из вершины A идет ребро в вершину B, если для решения A необходимо решить B. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 6 / 40
  • 22. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 7 / 40
  • 23. Наибольшая возрастающая подпоследовательность Определение Задача о наибольшей возрастающей последовательности (longest increasing subsequence problem) заключается в нахождении по данной последовательности её возрастающей подпоследовательности максимальной длины. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40
  • 24. Наибольшая возрастающая подпоследовательность Определение Задача о наибольшей возрастающей последовательности (longest increasing subsequence problem) заключается в нахождении по данной последовательности её возрастающей подпоследовательности максимальной длины. Пример А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40
  • 25. Наибольшая возрастающая подпоследовательность Определение Задача о наибольшей возрастающей последовательности (longest increasing subsequence problem) заключается в нахождении по данной последовательности её возрастающей подпоследовательности максимальной длины. Пример Рассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7. 5 2 8 6 3 6 9 7 А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40
  • 26. Наибольшая возрастающая подпоследовательность Определение Задача о наибольшей возрастающей последовательности (longest increasing subsequence problem) заключается в нахождении по данной последовательности её возрастающей подпоследовательности максимальной длины. Пример Рассмотрим последовательность 5, 2, 8, 6, 3, 6, 9, 7. 5 2 8 6 3 6 9 7 Ясно, что нам просто нужно найти длиннейший путь в этом графе. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 8 / 40
  • 27. Алгоритм Алгоритм 1 for j ← 1 to n 2 do L(j) ← 1 + max{L(i) : (i, j) ∈ E } 3 £ L(j) — длина максимальной последовательности, заканчивающейся в j-м элементе 4 return maxj L(j) А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 9 / 40
  • 28. Замечания Замечания А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40
  • 29. Замечания Замечания Время работы есть O(n2 ). А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40
  • 30. Замечания Замечания Время работы есть O(n2 ). Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важным свойством: на подзадачах задан частичный порядок и отношение, определяющее, как решить задачу по ее более простым подзадачам. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40
  • 31. Замечания Замечания Время работы есть O(n2 ). Мы опять решали подзадачи вида {L(j) : 1 ≤ j ≤ n} с важным свойством: на подзадачах задан частичный порядок и отношение, определяющее, как решить задачу по ее более простым подзадачам. Наш алгоритм находит длину максимальной возрастающей подпоследовательности, но его легко модифицировать так, чтобы он находил и саму максимальную подпоследовательность. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 10 / 40
  • 32. Рекурсия и динамическое программирование Рекурсия и динамическое программирование А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40
  • 33. Рекурсия и динамическое программирование Рекурсия и динамическое программирование Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40
  • 34. Рекурсия и динамическое программирование Рекурсия и динамическое программирование Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}. L(4) L(1) L(2) L(3) L(1) L(1) L(2) L(1) А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40
  • 35. Рекурсия и динамическое программирование Рекурсия и динамическое программирование Рекурсивное определение: L(j) = 1 + max{L(1), L(2), . . . , L(j − 1)}. L(4) L(1) L(2) L(3) L(1) L(1) L(2) L(1) Эффективность динамического программирования достигается, таким образом, за счет разумного перечисления подзадач и порядка на них. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 11 / 40
  • 36. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 12 / 40
  • 37. Стоимость редактирования Определение Задача о стоимости редактирования (edit distance problem) заключается в нахождении минимального количества вставок, удалений и замен букв, необходимых для того, чтобы из одного входного слова получить другое. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 13 / 40
  • 38. Стоимость редактирования Определение Задача о стоимости редактирования (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
  • 39. Подзадачи Подзадачи А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 40. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 41. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. Нам нужно найти стоимость редактирования строчек x[1 . . . m] и y [1 . . . n]. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 42. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. Нам нужно найти стоимость редактирования строчек x[1 . . . m] и y [1 . . . n]. Естественной подзадачей является E (i, j) — стоимость редактирования префикса длины i строчки x и префикса длины j строчки y . А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 43. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. Нам нужно найти стоимость редактирования строчек x[1 . . . m] и y [1 . . . n]. Естественной подзадачей является E (i, j) — стоимость редактирования префикса длины i строчки x и префикса длины j строчки y . Нашей целью является вычисление E (m, n). А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 44. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. Нам нужно найти стоимость редактирования строчек 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)}. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 14 / 40
  • 45. Подзадачи Подзадачи Важным моментом динамического программирования является выбор подзадач. Нам нужно найти стоимость редактирования строчек 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
  • 46. Алгоритм Алгоритм 1 for i ← 0 to m 2 do E (i, 0) = i 3 for j ← 0 to n 4 do E (0, j) = j 5 for i ← 1 to m 6 do for j ← 1 to n 7 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
  • 47. Соответствующий граф 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
  • 48. Соответствующий граф 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
  • 49. Соответствующий граф 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
  • 50. Стандартные способы выбора подзадач Стандартные способы выбора подзадач вход подзадача x1 , . . . , xn x1 , . . . , xi x1 , . . . , xn и y1 , . . . , ym x1 , . . . , xi и y1 , . . . , yj x1 , . . . , xn xi , . . . , xj дерево поддерево А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 17 / 40
  • 51. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 18 / 40
  • 52. Задача о рюкзаке Определение Задача о рюкзаке (knapsack problem) заключается в нахождении по данному набору из n предметов со стоимостями v1 , . . . , vn и весами w1 , . . . , wn , а также общему весу W поднабора веса не более W максимальной стоимости. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 19 / 40
  • 53. Задача о рюкзаке Определение Задача о рюкзаке (knapsack problem) заключается в нахождении по данному набору из n предметов со стоимостями v1 , . . . , vn и весами w1 , . . . , wn , а также общему весу W поднабора веса не более W максимальной стоимости. Алгоритм для рюкзака с повторениями 1 £ K (w ) — максимальная стоимость при весе не более w 2 K (0) = 0 3 for w ← 1 to W 4 do K (w ) ← max{K (w − wi ) + vi : wi ≤ w } 5 return K (W ) А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 19 / 40
  • 54. Рюкзак без повторений Алгоритм для рюкзака без повторений 1 £ K (w , j) — максимальная стоимость при весе не более w среди первых j предметов 2 for all j, w 3 do K (0, j) = K (w , 0) = 0 4 for j ← 1 to n 5 do for w ← 1 to W 6 do if wj > w 7 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
  • 55. Запоминание Запоминание А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40
  • 56. Запоминание Запоминание Как мы уже видели, реализация вычисления решения для задачи при помощи подзадач простой рекурсией может быть очень не эффективной по той причине, что одни и те же вычисления будут производиться многократно. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40
  • 57. Запоминание Запоминание Как мы уже видели, реализация вычисления решения для задачи при помощи подзадач простой рекурсией может быть очень не эффективной по той причине, что одни и те же вычисления будут производиться многократно. Можно, однако, избежать повторений в рекурсии. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 21 / 40
  • 58. Запоминание Запоминание Как мы уже видели, реализация вычисления решения для задачи при помощи подзадач простой рекурсией может быть очень не эффективной по той причине, что одни и те же вычисления будут производиться многократно. Можно, однако, избежать повторений в рекурсии. Рекурсивный алгоритм для рюкзака с повторениями 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
  • 59. Запоминание Запоминание А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40
  • 60. Запоминание Запоминание Данный алгоритм не решает по несколько раз одну и ту же задачу, но все-таки тратит какое-то лишнее время на рекурсивные вызовы. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40
  • 61. Запоминание Запоминание Данный алгоритм не решает по несколько раз одну и ту же задачу, но все-таки тратит какое-то лишнее время на рекурсивные вызовы. Впрочем, такой трюк может иногда давать и выигрыш: метод динамическго программирования решает каждую подзадачу, в то время как рекурсия с запоминанием решает только подзадачи, необходимые для вычисления конечного результата. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40
  • 62. Запоминание Запоминание Данный алгоритм не решает по несколько раз одну и ту же задачу, но все-таки тратит какое-то лишнее время на рекурсивные вызовы. Впрочем, такой трюк может иногда давать и выигрыш: метод динамическго программирования решает каждую подзадачу, в то время как рекурсия с запоминанием решает только подзадачи, необходимые для вычисления конечного результата. Например, если общий вес рюкзака, а также веса всех предметов кратны 100, то рекурсия с запоминанием будет рассматривать только подзадачи, где вес также кратен 100, в то время как метод динамического программирования переберет и все оставшиеся подзадачи. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 22 / 40
  • 63. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 23 / 40
  • 64. Перемножение нескольких матриц Перемножение нескольких матриц А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40
  • 65. Перемножение нескольких матриц Перемножение нескольких матриц Пусть нам нужно вычислить произведение A × B × C × D матриц размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40
  • 66. Перемножение нескольких матриц Перемножение нескольких матриц Пусть нам нужно вычислить произведение A × B × C × D матриц размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно. Как известно, умножение матриц ассоциатвино, поэтому порядок, в котором мы будем перемножать, на результат никак не влияет. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40
  • 67. Перемножение нескольких матриц Перемножение нескольких матриц Пусть нам нужно вычислить произведение A × B × C × D матриц размера 50 × 20, 20 × 1, 1 × 10, 10 × 100, соответственно. Как известно, умножение матриц ассоциатвино, поэтому порядок, в котором мы будем перемножать, на результат никак не влияет. Он, однако, может повлиять на время, необходимое для перемножения. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 24 / 40
  • 68. Перемножение нескольких матриц Перемножение нескольких матриц Пусть нам нужно вычислить произведение 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
  • 69. Представление порядков бинарными деревьями D A D C D A A B B C B C А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 25 / 40
  • 70. Представление порядков бинарными деревьями D A D C D A A B B C B C Количество таких деревьев экспоненциально. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 25 / 40
  • 71. Подзадачи Подзадачи А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40
  • 72. Подзадачи Подзадачи Ясно, что у оптимального дерева поддеревья также оптимальны. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40
  • 73. Подзадачи Подзадачи Ясно, что у оптимального дерева поддеревья также оптимальны. В каждом поддереве вычисляется произведение вида Ai × Ai+1 × · · · × Aj . А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40
  • 74. Подзадачи Подзадачи Ясно, что у оптимального дерева поддеревья также оптимальны. В каждом поддереве вычисляется произведение вида Ai × Ai+1 × · · · × Aj . Пусть C (i, j) — минимальное количество умножений, необходимых для вычисления Ai × Ai+1 × · · · × Aj . А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 26 / 40
  • 75. Подзадачи Подзадачи Ясно, что у оптимального дерева поддеревья также оптимальны. В каждом поддереве вычисляется произведение вида 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
  • 76. Алгоритм Алгоритм 1 for i ← 1 to n 2 do C (i, i) = 0 3 for s ← 1 to n − 1 4 do for i ← 1 to n − s £ s — размер подзадачи 5 do j = i + s 6 C (i, j) = mini≤k<j {C (i, k) + C (k + 1, j) + mi−1 · mk · m 7 return C (1, n) А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 27 / 40
  • 77. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 28 / 40
  • 78. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 29 / 40
  • 79. Кратчайшие надежные пути Определение Задача о кратчайшем надежном пути (shortest reliable path problem) заключается в нахождении по данному взвешенному графу с двумя выделенными вершинами s и t, а также числу k кратчайшего пути из s в t, состоящего не более чем из k ребер. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40
  • 80. Кратчайшие надежные пути Определение Задача о кратчайшем надежном пути (shortest reliable path problem) заключается в нахождении по данному взвешенному графу с двумя выделенными вершинами s и t, а также числу k кратчайшего пути из s в t, состоящего не более чем из k ребер. Подзадачи А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40
  • 81. Кратчайшие надежные пути Определение Задача о кратчайшем надежном пути (shortest reliable path problem) заключается в нахождении по данному взвешенному графу с двумя выделенными вершинами s и t, а также числу k кратчайшего пути из s в t, состоящего не более чем из k ребер. Подзадачи Подзадачи нужно выбрать так, чтобы каким-нибудь образом запоминалась информация о длине пути. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40
  • 82. Кратчайшие надежные пути Определение Задача о кратчайшем надежном пути (shortest reliable path problem) заключается в нахождении по данному взвешенному графу с двумя выделенными вершинами s и t, а также числу k кратчайшего пути из s в t, состоящего не более чем из k ребер. Подзадачи Подзадачи нужно выбрать так, чтобы каким-нибудь образом запоминалась информация о длине пути. dist(v , i) есть длина кратчайшего пути, состоящего ровно из i ребер, из s в v А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 30 / 40
  • 83. Кратчайшие надежные пути Определение Задача о кратчайшем надежном пути (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
  • 84. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 31 / 40
  • 85. Кратчайшие пути между всеми парами вершин графа Определение Задача о кратчайших путях между всеми парами вершин (all-pairs shortest paths problem) заключается в нахождении по данному взвешенному графу кратчайших расстояний между всеми парами вершин. Предполагаем, что граф не содержит циклов отрицательного веса. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40
  • 86. Кратчайшие пути между всеми парами вершин графа Определение Задача о кратчайших путях между всеми парами вершин (all-pairs shortest paths problem) заключается в нахождении по данному взвешенному графу кратчайших расстояний между всеми парами вершин. Предполагаем, что граф не содержит циклов отрицательного веса. Подзадачи А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40
  • 87. Кратчайшие пути между всеми парами вершин графа Определение Задача о кратчайших путях между всеми парами вершин (all-pairs shortest paths problem) заключается в нахождении по данному взвешенному графу кратчайших расстояний между всеми парами вершин. Предполагаем, что граф не содержит циклов отрицательного веса. Подзадачи dist(i, j, k) — длина кратчайшего пути из i в j, все промежуточные вершины которого принадлежат множеству {1, . . . , k}. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40
  • 88. Кратчайшие пути между всеми парами вершин графа Определение Задача о кратчайших путях между всеми парами вершин (all-pairs shortest 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)} А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 32 / 40
  • 89. Кратчайшие пути между всеми парами вершин графа Определение Задача о кратчайших путях между всеми парами вершин (all-pairs shortest 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
  • 90. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 33 / 40
  • 91. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 92. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. Замечания А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 93. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. Замечания Количество различных циклов равно (n − 1)!. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 94. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. Замечания Количество различных циклов равно (n − 1)!. Естественной подзадачей в данном случае является начальная часть цикла. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 95. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. Замечания Количество различных циклов равно (n − 1)!. Естественной подзадачей в данном случае является начальная часть цикла. Об этой начальной части мы должны знать её последнюю вершину и множество внутренних вершин. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 96. Задача о коммивояжере Определение Задача о коммивояжере (traveling salesman problem) заключается в нахождении по данному полному взвешенному графу гамильтонова цикла минимальной стоимости. Замечания Количество различных циклов равно (n − 1)!. Естественной подзадачей в данном случае является начальная часть цикла. Об этой начальной части мы должны знать её последнюю вершину и множество внутренних вершин. Для подмножества вершин S ⊆ {1, . . . , n}, содержащего 1 и вершины j ∈ S C (S, j) есть длина кратчайшего пути, начинающегося в вершине 1, заканчивающегося в вершине j и проходящего ровно по разу все вершины множества S. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 34 / 40
  • 97. Алгоритм Алгоритм TSP(G ) 1 C ({1}, 1) = 0 2 for s ← 2 to n 3 do for S ⊆ {1, 2, . . . , n}, таких что |S| = s и 1 ∈ S 4 do C (S, 1) = ∞ 5 for j ∈ S, j ̸= 1 6 do C (S, j) = mini∈S,i̸=j {C (S ∖ {j}, i) + di,j } 7 return minj C ({1, . . . , n}, j) + dj1 А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 35 / 40
  • 98. Алгоритм Алгоритм TSP(G ) 1 C ({1}, 1) = 0 2 for s ← 2 to n 3 do for S ⊆ {1, 2, . . . , n}, таких что |S| = s и 1 ∈ S 4 do C (S, 1) = ∞ 5 for j ∈ S, j ̸= 1 6 do C (S, j) = mini∈S,i̸=j {C (S ∖ {j}, i) + di,j } 7 return minj C ({1, . . . , n}, j) + dj1 Время работы Время работы алгоритма есть O(n2 2n ). Полученный алгоритм хоть и гораздо быстрее полного перебора, но все же совершенно бесполезен на практике: экспоненциально не только время работы, но еще и память. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 35 / 40
  • 99. План лекции 1 Введение 2 Наибольшая возрастающая подпоследовательность 3 Стоимость редактирования 4 Задача о рюкзаке 5 Перемножение нескольких матриц 6 Кратчайшие пути Кратчайшие надежные пути Кратчайшие пути между всеми парами вершин графа Задача о коммивояжере 7 Независимые множества в деревьях А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 36 / 40
  • 100. Независимые множества в деревьях Определение Задача о максимальном независимом множестве (independent set problem) заключается в нахождении по данному графу множества попарно не соединенных ребрами вершин максимального размера. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40
  • 101. Независимые множества в деревьях Определение Задача о максимальном независимом множестве (independent set problem) заключается в нахождении по данному графу множества попарно не соединенных ребрами вершин максимального размера. Идеи А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40
  • 102. Независимые множества в деревьях Определение Задача о максимальном независимом множестве (independent set problem) заключается в нахождении по данному графу множества попарно не соединенных ребрами вершин максимального размера. Идеи В общем случае задача NP-трудна, но если входной граф является деревом, то может быть решена за линейное время. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40
  • 103. Независимые множества в деревьях Определение Задача о максимальном независимом множестве (independent set problem) заключается в нахождении по данному графу множества попарно не соединенных ребрами вершин максимального размера. Идеи В общем случае задача NP-трудна, но если входной граф является деревом, то может быть решена за линейное время. Пусть I (u) — размер максимального независимого множества в поддереве с корнем в u. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40
  • 104. Независимые множества в деревьях Определение Задача о максимальном независимом множестве (independent set problem) заключается в нахождении по данному графу множества попарно не соединенных ребрами вершин максимального размера. Идеи В общем случае задача NP-трудна, но если входной граф является деревом, то может быть решена за линейное время. Пусть I (u) — размер максимального независимого множества в поддереве с корнем в u. {︁ ∑︀ ∑︀ }︁ I (u) = max 1 + w — внук u I (w ), w — сын u I (w ) А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 37 / 40
  • 105. Об используемой памяти Об используемой памяти А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40
  • 106. Об используемой памяти Об используемой памяти Как правило, время работы алгоритма, основанного на методе динамического программирования, равно количеству вершин в соответствующем графе. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40
  • 107. Об используемой памяти Об используемой памяти Как правило, время работы алгоритма, основанного на методе динамического программирования, равно количеству вершин в соответствующем графе. Ясно, что объема памяти, пропорционального количеству вершин, будет достаточно, но иногда можно обойтись и меньшим объемом. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40
  • 108. Об используемой памяти Об используемой памяти Как правило, время работы алгоритма, основанного на методе динамического программирования, равно количеству вершин в соответствующем графе. Ясно, что объема памяти, пропорционального количеству вершин, будет достаточно, но иногда можно обойтись и меньшим объемом. Например, если для подсчета значения dist(·, ·, k + 1) необходимы только значения dist(·, ·, k), то нет никакой небходимости в каждый момент хранить значения для всех k. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 38 / 40
  • 109. Что мы узнали за сегодня? Что мы узнали за сегодня? А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 110. Что мы узнали за сегодня? Что мы узнали за сегодня? Метод динамического программирования применим тогда, когда решение задачи сводится к решению нескольких более простых перекрывающихся задач. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 111. Что мы узнали за сегодня? Что мы узнали за сегодня? Метод динамического программирования применим тогда, когда решение задачи сводится к решению нескольких более простых перекрывающихся задач. Основным моментом метода является определение подзадач и способа построения решения из решений для более простых задач. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 112. Что мы узнали за сегодня? Что мы узнали за сегодня? Метод динамического программирования применим тогда, когда решение задачи сводится к решению нескольких более простых перекрывающихся задач. Основным моментом метода является определение подзадач и способа построения решения из решений для более простых задач. По задаче, таким образом, строится ориентированный ациклический граф. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 113. Что мы узнали за сегодня? Что мы узнали за сегодня? Метод динамического программирования применим тогда, когда решение задачи сводится к решению нескольких более простых перекрывающихся задач. Основным моментом метода является определение подзадач и способа построения решения из решений для более простых задач. По задаче, таким образом, строится ориентированный ациклический граф. Время работы, как правило, равно количеству вершин этого графа. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 114. Что мы узнали за сегодня? Что мы узнали за сегодня? Метод динамического программирования применим тогда, когда решение задачи сводится к решению нескольких более простых перекрывающихся задач. Основным моментом метода является определение подзадач и способа построения решения из решений для более простых задач. По задаче, таким образом, строится ориентированный ациклический граф. Время работы, как правило, равно количеству вершин этого графа. Используемая память может быть и меньше. А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 39 / 40
  • 115. Спасибо за внимание! А. Куликов (CS клуб при ПОМИ) 16. Динамическое программирование 40 / 40