Существует две типичные реализации подхода динамического программирования: снизу вверх и сверху вниз .
сверху внизbottom Динамическое программирование - это не что иное, как обычная рекурсия , улучшенная запоминанием решений для промежуточных подзадач.Когда данная подзадача возникает во второй (третий, четвертый ...) раз, она не решается с нуля, а вместо этого используется ранее запомненное решение.Этот метод известен под именем memoization (без 'r' до 'i').
Это именно то, что должен иллюстрировать ваш пример с последовательностью Фибоначчи.Просто используйте рекурсивную формулу для последовательности Фибоначчи, но постройте таблицу значений fib(i)
по пути, и вы получите алгоритм DP сверху вниз для этой задачи (так, например, если вам нужно вычислить fib(5)
во второй раз вы берете его из таблицы, а не вычисляете снова).
В Динамическое программирование снизу вверх подход также основан на хранении подрешения в памяти,но они решаются в другом порядке (от меньшего к большему), и итоговая общая структура алгоритма не является рекурсивной. Алгоритм LCS является классическим примером DP-снизу-вверх.
Алгоритмы DP-снизу-вверх обычно более эффективны, но их обычно сложнее (а иногда и невозможно) построить,поскольку не всегда легко предсказать, какие примитивные подзадачи вам понадобятся для решения всей исходной проблемы, и какой путь вы должны выбрать из небольших подзадач, чтобы наиболее эффективно найти окончательное решение.