Табличный DP — другой взгляд на ту же идею. Вместо рекурсииПриём, при котором функция вызывает саму себя. Нужен базовый случай, чтобы вызовы завершились. «сверху» мы идём снизу: заводим массив (таблицу) dp, заполняем самые простые случаи, а затем строим ответы посложнее из уже посчитанных. Никакой рекурсии и риска переполнить стек — только циклКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно..
Зелёные — база; каждая следующая клетка — сумма двух предыдущих.
▶ fib-table.py
Часто всю таблицу хранить не нужно — для Фибоначчи достаточно двух последних значений. Это оптимизация по памяти с O(n) до O(1):
▶ fib-two-vars.py
Классика: дом-грабитель (House Robber)
Задача с собеседований: дан списокИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list. сумм денег в домах. Нельзя грабить два соседних дома. Какую максимальную сумму можно унести? Для каждого дома выбираем лучшее из двух: пропустить его (берём прошлый максимум) или ограбить (его деньги + максимум до позапрошлого).
▶ house-robber.py
💡Совет
Предскажите вывод. Что вернёт rob([10, 1, 1, 10])? Подумайте, какие дома выгоднее ограбить, не трогая соседей.
▶ predict-rob.py
Вернётся 20: грабим первый и последний дом (10 + 10), а средние пропускаем. ДП само находит этот выбор, перебирая на каждом шаге «брать или не брать».
⚠️ Частые ошибки новичков
Ошибка. Неправильно задать размер таблицы или базовые случаи — выйти за границы списка (IndexError) или забыть инициализировать dp[1]. Перед циклом всегда проверяйте маленькие n (0, 1) отдельно и убедитесь, что таблица длиной n + 1. Запустите код с ошибкой границ.
▶ broken-table.py
Заданиерешение.py
Напишите rob(houses) (дом-грабитель) табличным способом: максимум денег без двух соседних домов. Пустой список → 0.
Заданиерешение.py
Напишите longest_increasing(nums) — длину наибольшей строго возрастающей подпоследовательности (элементы не обязательно подряд). Используйте таблицу dp[i] = длина возрастающей подпоследовательности, заканчивающейся в i.
❓Проверь себя
Чем табличный DP отличается от мемоизации?
В задаче «дом-грабитель» какой выбор на каждом шаге?
Зачем хранить только два последних значения вместо всей таблицы?
ℹ️Важно
✅ Что вы узнали
Табличный DP идёт снизу вверх циклом, без рекурсии.
Часто хватает пары переменных вместо всей таблицы — O(1) память.
Дом-грабитель: на каждом шаге «пропустить или ограбить».
Комментарии
Загрузка…
Загрузка комментариев…