Динамическое программирование (ДП) — это метод решения сложных вычислительных задач путем разбиения их на более простые подзадачи. Результаты решения этих подзадач сохраняются (мемоизация или табуляция) во избежание повторных вычислений. Это позволяет значительно оптимизировать производительность по сравнению с наивными рекурсивными решениями.
Основные принципы:
Два основных подхода:
Пример. Задача о числе Фибоначчи:
Наивное рекурсивное решение (без ДП):
python
Решение с ДП (мемоизация):
python
Решение с ДП (табуляция):
python
Различия между мемоизацией и табуляцией:
| Параметр | Мемоизация (Нисходящий) | Табуляция (Восходящий) |
|---|---|---|
| Подход | Рекурсивный | Итеративный |
| Порядок | Вычисления в зависимости от запроса | Вычисления в предопределенном порядке |
| Память | Может использовать больше памяти (стек) | Обычно использует фиксированный массив/таблицу |
| Реализация | Может быть проще для некоторых задач | Обычно более эффективна по памяти и скорости |
ДП применяется в различных областях, включая: