Задачи на динамику (7 октября 2016)
- [35 минут] Динамика: общие идеи
- Количество способов дойти из 1 в N, используя ходы +1,+2,...,+k
- Калькулятор.Easy: x → x+1, 2x, 3x; n ≤ 106. Простая линейная динамика.
- Динамика вперед, назад, рекурсивно-ленивая (на примере задачи про калькулятор)
- Калькулятор.Hard: x → 2x+1, 3x+2, 5x+1 ; n ≤ 1018. Ленивая динамика с конца.
- Динамика и ацикличный граф: состояния, переходы, вперед, назад, ленивость
- Восстановление ответа, 2 способа: или храним ссылки между состояниями , или не храним
− Перерыв −
- [25 минут] Задачи (простые)
- Максимальный по сумме чисел лево-верхний путь в "матрице чисел c непроходимыми дырками" (простое упрожнение)
- Задача Иосифа (n людей по кругу, считалочка, выходит каждый k-й, кто остался?). O(n). (учимся видеть состояния)
- Есть одна кучка. Двое играют в игру "первый может брать a1, a2, ... ak, второй может брать b1, ... bm", кто не может ходить проиграл (более сложное состояние)
- Выбрать самую длинную подпоследовательность-палиндром O(n2) (динамика по подотрезкам)
- [skipped] Оптимизируем память: до O(n), если не нужно восстанавливать ответ, до O(n2/wordsize), если нужно.
- [30 минут] Задачи (посложнее)
- Рюкзак без стоимостей (набрать вес ровно W подмножеством предметов). Решается за O(2n/2n) и O(nW/wordsize).
- Решение за O(nW) времени и памяти, оптимируем память до O(nW/wordsize)
- [skipped] Оптимизируем время до O(nW/wordsize) (bitset = массив + битовые операции, как с целыми числами)
- O(W) памяти одним массивом, без восстановления ответа
- O(W) памяти с восстановлением ответа, доказываем, что в ответе нет повторов
- Наибольшая общая возрастающая подпоследовательность за O(n2)
- НВП = online курс, НОП = f[i,j]
- Решение НОВП за n3: f[i,j,prev], i и j не обязательно концы последовательностей
- Решение НОВП за n4: f[i,j], i и j обязательно концы последовательностей, prev=a[i]
- Решение НОВП за n3 и n2 памяти: f[i,j], i − конец, j − необязательно
- Решение НОВП за n2: то же, что и предыдущее, но слудующее i возьмём жадно
- [skipped] Folding: запаковать строку timus : 1238 за O(n3)
- [skipped] Решаем за O(n4)
- [skipped] Решаем за O(n3 log n) − догадались перебирать только делители
- [skipped] Решаем за O(n3) − догадались насчитать динамику LCP[i,j]