← Все вопросы
Как оценить число состояний и переходов в ДП, чтобы заранее понять, пройдёт ли по времени?
10
Часто придумываю ДП, кодирую — и ловлю TLE, потому что не прикинул заранее асимптотику. Как до написания кода аккуратно оценить сложность ДП по числу состояний и стоимости перехода, и с каким бюджетом операций сравнивать на CF (1–2 сек)?
2 ответа
14
✓ Принятый ответ — помог автору
Базовая формула: время ДП = (число состояний) × (стоимость одного перехода).
- Число состояний — произведение размеров всех измерений таблицы. Примеры:
- 1D рюкзак: состояний .
- interval DP
dp[i][j]: состояний. - bitmask DP
dp[mask][i]: . - digit DP
dp[pos][rem][tight]: .
- Стоимость перехода — сколько работы на вычисление одного состояния:
- перебор точки разбиения в interval DP: → итого .
- перебор соседа в TSP: → итого .
- константа (Фибоначчи): → итого = числу состояний.
Бюджет операций на Codeforces: ориентир – простых операций в секунду (с учётом константы, кэша). Грубо: — спокойно проходит за 1 сек, — рискованно, нужна лёгкая константа.
Пример прикидки: TSP при → — пройдёт. При → — TLE, нужен другой подход.
7
Что ещё учитывать помимо голой формулы:
- Память считается отдельно: число состояний × размер ячейки.
long long= 8 МБ — ок, — уже 128 МБ, MLE. Часто память — более жёсткий лимит, чем время. - Константа реализации.
unordered_map-мемоизация в 10–50× медленнее массива. Рекурсия добавляет накладные. Битовые операции и кэш-дружелюбный обход (по строкам) ускоряют в разы. - Сублинейные переходы. Иногда перебор в переходе ускоряется префиксными суммами / деревом отрезков / CHT / монотонной очередью — это снижает и весь ДП. Перед кодом полезно прикинуть: «а нельзя ли переход сделать за / вместо ?»
Правило большого пальца: ограничения в условии (n ≤ ...) намекают на целевую сложность. → ждут ; → ; → ; → .
Ваш ответ
Войдите, чтобы ответить на вопрос.