Я работал над динамическим программированием в течение некоторого времени. Канонический способ оценить рекурсию динамического программирования - создать таблицу всех необходимых значений и заполнять ее построчно. См., Например, Cormen, Leiserson и др .: «Введение в алгоритмы» для введения.
Я сосредотачиваюсь на схеме вычислений на основе таблиц в двух измерениях (построчное заполнение) и исследую структуру зависимостей ячеек, то есть какие ячейки необходимо выполнить, прежде чем можно будет вычислить другую. Обозначим через множество индексов клеток, от которых зависит клетка i . Обратите внимание, что Γ должен быть свободным от цикла.
Я абстрагируюсь от фактической функции, которая вычисляется, и концентрируюсь на ее рекурсивной структуре. Формально, я считаю recurrrence быть динамическим программированием , если она имеет вид
с , ~ Г д ( я ) = { ( J , д ( J ) ) | J ∈ Г д ( я ) } и е некоторой (вычислимому) функция, не используйте d, кроме как через ˜ Γ d .
При ограничении детальности на неровные области (слева, вверху слева, сверху, верхние правой, ... из текущей ячейки) один отмечает , что, по существу , три случая (до симметрий и вращения) Валиды рекурсии динамического программирования, которые информируют, как таблица может быть заполнена:
Красные области обозначают (чрезмерное приближение) . Случаи один и два допускают подмножества, случай три - наихудший случай (с точностью до преобразования индекса). Обратите внимание, что строго не требуется, чтобы все красные области были покрыты Γ ; Некоторые ячейки в каждой красной части таблицы достаточны, чтобы нарисовать ее красной. Белые области явно необходимы, чтобы не содержать никаких обязательных ячеек.
Примерами для первого случая являются расстояние редактирования и самая длинная общая подпоследовательность , второй случай - для Bellman & Ford и CYK . Менее очевидные примеры включают в себя такие, что работают с диагоналями, а не с рядами (или столбцами), поскольку их можно поворачивать для соответствия предлагаемым случаям; см . ответ Джо для примера.
У меня нет (естественного) примера для случая три, хотя! Итак, мой вопрос: каковы примеры для случая три рекурсии / проблемы динамического программирования?
источник
Ответы:
Существует множество других примеров алгоритмов динамического программирования, которые совсем не соответствуют вашему шаблону.
Самая длинная возрастающая проблема подпоследовательности требует только одномерной таблицы.
Существует несколько естественных алгоритмов динамического программирования, таблицы которых требуют трех или даже более измерений. Например: Найти белый прямоугольник максимальной площади в растровом изображении. Алгоритм естественного динамического программирования использует трехмерную таблицу.
Но самое главное, динамическое программирование не связано с таблицами ; это о раскручивании рекурсии. Существует множество естественных алгоритмов динамического программирования, в которых структура данных, используемая для хранения промежуточных результатов, не является массивом, потому что повторяющееся повторение не входит в диапазон целых чисел. Два простых примера - найти самый большой независимый набор вершин в дереве и найти самое большое общее поддерево из двух деревьев. Более сложный пример - алгоритм аппроксимации для евклидовой задачи коммивояжера Ароры и Митчелла.( 1 + ϵ )
источник
Это не идеально соответствует требованиям, так как количество столбцов бесконечно, и вычисления обычно выполняются сверху вниз с запоминанием, но я думаю, что стоит упомянуть.
источник
Это не совсем подходит для случая 3, но я не знаю, отражает ли какой-либо из ваших случаев очень распространенную проблему, используемую для обучения динамическому программированию: матричное умножение цепей . Чтобы решить эту проблему (и многие другие, это только каноническая проблема), мы заполняем матрицу диагональю по диагонали вместо строки за строкой.
Итак, правило примерно такое:
источник
Я знаю, это глупый пример, но я думаю, что простая итерационная проблема, такая как
может претендовать Традиционный «для каждой строки для каждого столбца» вроде как ваш случай 3.
источник
Это не совсем то пространство поиска, которое вы ищете, но у меня есть представление о макушке, которое может помочь.
Проблема:
Ответ
Это может быть решено следующим рекурсивным способом:
источник