Глоссарий

Динамическое программирование

Динамическое программирование (DP) — техника оптимизации рекурсивных алгоритмов: результаты подзадач кешируются, чтобы не вычислять их повторно. Превращает задачи с O(2ⁿ) в O(n) или O(n²).

Два подхода

Числа Фибоначчи

// Без DP: O(2^n)
fib(n) = fib(n-1) + fib(n-2)

// С мемоизацией: O(n)
$memo = [];
function fib(int $n): int {
  global $memo;
  if ($n <= 1) return $n;
  return $memo[$n] ??= fib($n-1) + fib($n-2);
}

Когда применять

Задача имеет оптимальную подструктуру (оптимальное решение состоит из оптимальных подрешений) и пересекающиеся подзадачи. Классические задачи: наибольшая общая подпоследовательность, задача о рюкзаке, кратчайший путь в графе.