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