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