Динамика (9 ноября 2016)
- Динамика, вводная (на примерах)
- Кратчайшая последовательность операций из 1 получить N, операции: x → x+1,x+7,2x,3x
- Вперед
- Назад
- Рекурсивно-ленивая
- Задача про путь "на матрице с дыркам": sum → max кол-во способов
- Задача про путь "на матрице с дыркам": можно хранить путь до состояния, можно от состояния
- Восстановление ответа, 2 способа: или храним ссылки между состояниями, или не храним
- Граф динамики: состояния, переходы, вперед (исходящие рёбра), назад (входящие рёбра), ленивая (только достижимые состояния)
- Что нужно, чтобы решить задачу динамикой? Список: состояние динамики, переходы между состояниями, начальное состояние, конечное состояние, порядок пересчёта.
− Перерыв −
- Рюкзак
- Условие: даны вещи, у них есть веса, выбрать подмножества суммарного веса ровно W
- is[i, w i] (w − вес, i − префикс)
- is[w] (хранить только последнюю строку)
bitset<W>
реализация на bitset-ах
- last[w], восстановление ответа с линейной памятью
- НОП
- Условие: даны две последовательности, выбрать наибольшую общую подпоследовательность
- Решение: f[i, j] − длина НОП для s[:i], t[:j]
- НВП за n2
- Расстояние Левинштейна за n2
- НОП: оптимизация памяти
- Оптимизация памяти: без восстановления ответа храним только 2 строки
- Оптимизация памяти: с восстановлением ответа храним только
bitset<N> f[N];
- Оптимизация памяти: алгоритм Хиршберга
- Область применения хиршберга: расстояние Левинштейна, любая задача монотонная по обеим координатам