Динамика комбинаторная и на подмножествах (26 ноября 2024)
- Для старшей группы: анекдот (цель: показать, что динамика, это не только про пути)
- Динамика − часто это или "найти путь в графе", или "число путей в графе". Но не только.
- Приведите пример! Ответ: динамика по подотрезкам.
- Динамика по подотрезкам (цель: закрепить уже изученное на практике, порядок переходов)
- Пример: произведение матриц. Сводим задачу к меньшим такого же вида.
- Динамика тоже описывается графом, но не является напрямую задачей поиска пути на этом графе
- DP и возведение матрицы в степень
- Пути в графе (количество путей длины ровно k)
- Числа фибоначчи (начали на практике)
- Рекуррентные соотношения за O(k3 log n) (начали на практике)
- Реклама: рекуррентные соотношения можно решать и за O(k log k log n)
- Комбинаторика
- Картинка с 6 перестановками и рассказ "какие задачи мы хотим решать" (object2index, index2object, next, prev)
- Указание лектору: начать нужно с перестановок, там формулы. Затем обязательно скобочные последовательности, там уже динамика.
- Объект по номеру, номер по объекту: примеры − перестановки, скобочные последовательности
- Зачем это нужно? Хранение объекта минимальным числом бит (например, на диске или состояние динамики; например, разбиение на слагаемые)
- Следующий лексикографически: пример перестановка, скобочная последовательность
- Зачем это нужно? Перебор всех объектов без рекурсии
- Работа с множествами, как с целыми числами. Примеры на все операции.
- Биекция между числами 0..2n-1 и подмножествами {0,1,...,n-1}
- Посмотреть i-й бит, присвоить i-й бит, обнулить i-й бит, множество всех элементов.
- Пересечение, объединение, разность. Проверка, содержится ли.
- Добавить к множеству элемент: +, ^, |
- Динамика по подмножествам
- Задачи: количество единичных бит в числе и сумма на подмножестве
- Версия за 2nn и рекурсивная версия за 2n
- Динамика: количество бит в числе (popcount[i] = popcount[i/2] + i%2)
- Динамика: сумма на подмножестве (sum[i] = sum[i ^ bit] + w[bit])
- Гамильтонов путь и цикл
- Определения.
- Решение задачи про путь за O(2nn2) времени и O(2nn) памяти is[A, v] → is[A|2x,x].
- Сводим задачу про цикл к задаче про путь.
- Улучшаем память до 2n (битовый массив, минимальное изменение кода) end[A] |= 2v.
- Улучшаем время до 2nn (пересекается ли adj[x] c end[A^2x])
- Задача: покрасить вершины графа в минимальное число цветов
- Предподсчет good[A] за O(2nn2). Решение за O(4n).
- Перебор всех подмножеств всех множеств циклами for за O(3n), решение нашей задачи за O(3n + 2nn2).
- Замена O(2nn2) на O(2n) (good[] - динамика).