Динамика (20 ноября 2014)
- Динамика: общие идеи
- Динамика вперед, назад, рекурсивно-ленивая (на примере задачи про калькулятор)
- Динамика и ацикличный граф: состояния, переходы, вперед, назад, ленивая
- Рюкзак. Только веса, ценностей нет. Решение за O(nW) и O(W) памяти с восстановлением ответа.
- Примеры задач
- Наибольшая общая подпоследовательность двух, трех (делаем память линейной, квадратной)
- Найти кратчайший путь/количество путей коня, который ходит только вправо (общие слова про ацикличный граф, в ацикличном графе просто искать путь)
- Нужно упаковать строку: задача folding, динамика на подотрезках
- Нужно упаковать строку: LZSS
- Нужно посчитать количество путей длины k. Или кратчайший путь длины k. Решение с возведением матрицы в степень.
- Битовые операции
- Посмотреть i-й бит, присвоить i-й бит, обнулить i-й бит, множество всех элементов.
- Пересечение, объединение, разность. Проверка, содержится ли.
- Старший бит, младший бит.
- Динамика по подмножествам
- Сумма на подмножестве, количество бит в числе, старший бит, младший бит, перевернутая битовая запись.
- Для каждого множества посчить количество независимых подмножеств за O(2n).
- Гамильтонов путь за O(2nn2) времени, за O(2nn) времени.
- Гамильтонов путь за O(2nn) времени.
- Перебор всех подмножеств, надмножеств. Раскраска графа в минимальное количество цветов за O(3n).
- Решение мультирюкзака (унести все вещи минимальным числом подходов) за O(3n).
- Динамика по скошенному профилю
- Перебор + запоминание хеш-таблицей + полиномиальный хеш
- Прямое написание за O(2min(w,h)wh) времени и O(2min(w,h)) памяти
- Бонус хеш-таблицы: хранятся только достижимые состояния (ленивость). Бонус рекурсии: удобно пересчитывать состояние.
- Динамика по профилю по графу (обойдем поиском в ширину, в таком порядке запустим перебор с запоминанием)
Если останется время:
- Задача про погрузку грузов (можно брать вещи с двух концов последовательности, в ящик помещается W, минимизировать кол-во ящиков)
- Пример 2 3 4 5 6 7, W = 9 : 2+3+4 = Wrong Way, 2+7, 3+6, 4+5 = 3 ящика
- Решение за O(n4) f[L, R] → [a, b]
- Решение за O(n3) f[L, R] → [a, b], где b = min возможный (два указателя)
- Измельчаем переход [a,b,f,w], динамики с is[a,b,f,w], w[a,b,f], f[a,b,w]
- Динамика за квадрат времени: pair(f, w) [a,b]
- Оптимизация памяти до линии
- Фукнция: можно считать расстояние от начальной вершины до текущей, можно расстояние от текущей до конечной (смотрим, что изменится)
- Функция: можно делать пересчет вперед и назад, можно лениво (смотрим, что изменится)