Мемоизация биномиальных коэффициентов
Задача по программированию с проверкой онлайн
- Сложность
- Средняя
- Языки
- Python
- JavaScript
- TypeScript
- Java
- Go
- Темы
- Функции и замыкания
- Динамическое программирование
- Словари и множества
Число сочетаний считается рекурсией Паскаля: c(n, k) = 1, если k = 0 или k = n, иначе c(n, k) = c(n - 1, k - 1) + c(n - 1, k).
Функция мемоизирована по паре (n, k) одним общим кэшем, который пуст в начале и общий для всех вызовов. «Вычислением» называется выполнение тела функции при промахе кэша (включая базовые случаи k = 0 и k = n); попадание в кэш вычислением не считается.
Дан список запросов calls, каждый — пара [n, k], где 0 ≤ k ≤ n ≤ 30. Обработайте их по порядку и для каждого верните пару [c(n, k), число вычислений в этом запросе].
Пример: [[4, 2], [4, 2], [5, 2]] → [[6, 8], [6, 0], [10, 3]]. Для c(4, 2) вычисляются восемь пар; повторный запрос ничего не вычисляет; для c(5, 2) новые пары: (5, 2), (4, 1) и (3, 0).
Источник: задача CodeShare