лекция-динамическое программирование.ppt
- Количество слайдов: 8
Динамическое программирование
План лекции: ü Понятие задачи и подзадачи ü Решение исходной задачи ü Нахождение структуры решения в двумерных таблицах ü Порядок вычисления таблиц, рекурсия с запоминанием
Задача и подзадачи: z Задача – это формализация в виде функции преобразования аргументов в значение. Агрументами чаще всего являются: 1) количество параметров; 2) значения параметров. z Подзадача – та же самая задача, но: z или с меньшим числом параметров z или хотя бы один из параметров имеет меньшее значение z Пример 1: нахождение НОД z Пример 2: сумма элементов одномерного массива. z Способ сведения решения задачи к решению подзадач, записанный в виде соотношения, наз. реккурентным соотношением z Пример 1: z Пример 2: z Задание: посчитать число палиндромов длины N (малые лат. буквы)
Решение исходной задачи z Необходим способ построения решения исходной задачи из решений подзадач z Используем таблицы для запоминания решения подзадач. Каждому элементу таблицы поставлена в соответствие комбинация параметров задачи. z Пример: В массиве чисел А найти подмассив максимальной суммы 1. Рассчитаем таблицу B, где B[i] = СУММА(A[1]. . A[i]). 2. Для каждого B[i] найдем MB[i] = MAX(B[i]-B[j]), j=0. . i-1. 3. Решение есть максимум из всех таких MB[i]. z Для двумеррных таблиц: в таблице А размера N на М найти максимально большую квадратную подматрицу одних 1. 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 2 2 0 1 1 1 2 3 1 1 1 2 0 1 2 2 1 0 1 - В(1, 1) = А[1, 1], - В(1, j) = А[1, j] при >= 2, - В(i, 1) = A[i, 1] при >= 2. При 2 <= i <= N и 2 <= j <= M : - B[i, j] = 0, если A[i, j] = 0. -B[i, j] = min{B[i – 1, j], B[i, j – 1], B[i – 1, j – 1]} + 1, если A[i, j] = 1 !! Хранить всю таблицу А или В не нужно
Нахождение структуры решения: z Иногда необходимо найти не просто количественную характеристику, а структуру (составляющие) решения z Нахождение количественной характеристики решения наз. прямым ходом ДП, нахождение структуры – обратным ходом ДП z Обычно решение восстанавливается по таблице, в кот. хранятся решения подзадач. При этом может понадобиться дополнительно сохранять информацию о том, какая именно подзадача была использована для решения задачи. z Пример: Для заданной числовой последовательности A[1. . N] найти максимальную длину подпоследовательности, что каждый последующий элемент подпоследовательности делился нацело на все предыдущие. i 1 2 3 4 5 А -3 5 6 0 -10 К 1 1 2 3 2 К(i) = max{ К(j) }+1 (j=1. . i-1), если А[i+1] mod A[j] = 0 К(i) = 1, если А[i+1] mod A[j] != 0 для всех j=1. . i-1 z Из таблицы К видно значение решения и его последний элемент, найдем предпоследний, это такой К[j]: А[i] mod A[j] = 0 и К[i] - К[j] =1. j=1. . i-1
Нахождение структуры решения в двухмерных таблицах z Имеется N предметов. Для каждого предмета известна его масса. Определить, существует ли несколько предметов, суммарная масса которых ровно X кг. Если такой набор существует, то требуется определить список предметов в наборе. z Определим функцию Т, равную 1, если набор существует, или 0 в противном случае. z Очевидно, что Т зависит от двух параметров – количества предметов и массы набора. Значит, имеем двумерную таблицу. z Запишем реккурентное соотношение для T(i, j): i – количество предметов j – масса набора Начальные условия: T(0, j)=0 при j 1, T(i, 0)=0 при i 1. {нельзя без предметов набрать массу j>0} {нельзя набрать нулевую массу } Для вычисления Т на каждом шаге нужно рассмотреть два случая: брать или не брать предмет I в набор T(i, j)= max(T(i-1, j), T(i-1, j-M[i])) при j M[i]. T(i, j)= T(i-1, j) при j
Порядок вычисления таблиц, рекурсия с запоминанием z До этого мы вычисляли таблицы последовательно в порядке увеличения значений и количества параметров. Но иногда удобно изменить порядок вычисления. z При этом реккурентное соотношение может быть записано так, что решение текущей подзадачи зависит от еще нерешенных подзадач. Тогда удобно использовать рекурсию с запоминанием. z Пример: Есть N валют. Для каждой пары валют (i, j) известен курс отмена А[i, j]. Валюту i можно менять на j, только если i
Еще один пример – задача «дроби из домино» z Есть кости домино, все они разные. На каждой от 1 до 5 точек. Кость может рассматриваться как дробь. Сумма нескольких костей дробей есть некоторая дробь X/Y. Нужно сказать, какое минимальное число дробей должно быть в сумме, чтобы получить X/Y. z Определим функцию и параметры: F(k, x, y) – минимальное кол-во костей из первых k, которыми можно собрать дробь x/y. z При попытке включить k-ую кость имеем три случая: 1) не включать, 2) включать как xk/yk, 3) включать как yk/xk. z Дополнительное ускорение - не считать функцию для сократимых дробей