Динамика (27 февраля 2014)
- Задачи
- Наибольшая общая двух за O(n2)
- Наибольшая общая трех за O(n3)
- Наибольшая общая возрастающая за O(n3), O(n2)
- Пример: наибольшая общая подпоследовательность
- Способы реализовать динамику
- Вперед [code]
- Назад [code-1] [code-2]
- Лениво (рекурсивно) [code]
- Случай когда ленивость улучшает: минимальное по весу паросочетание [text]
- Восстановление ответа
- Храним весь ответ [code]
- Храним ссылку назад [code] [bits]
- Ничего не храним [code]
- Оптимизация по памяти
- Храним только две строки, копируем [code]
- А теперь не копируем [code]
- А теперь все по модулю два [code]
- Рекурсия и доминошки
- Рекурсия [code]
- Запоминание, изломанный профиль [code]
- Интересные приемы
- Задача о возрастающей подпоследовательности
- len[i]
- len[i,j], x=a[j]
- [i, x, len]
- x[i, len], xi → xi+1
- Задача про погрузку грузов (можно брать вещи с двух концов последовательности, в ящик помещается W, минимизировать кол-во ящиков)
- 2 3 4 5 6 7, W = 9 : 2+3+5 = Wrong Way, 2+7, 3+6, 4+5 = 3 ящика
- Решение за O(n5) k[L, R] → [a, b]
- Решение за O(n3) k[L, R] → [a, b], где b = min возможный
- Решение за O(n2) [a, b, k, w] : pair(k, w) [a, b]
- Оптимизация памяти до линии