LIS - Алгоритм наибольшей возрастающей подпоследовательности в PHP O(nlogn)
Я нигде не могу найти решения для моей проблемы:(. Может кто-нибудь помочь мне и найти (или написать) этот алгоритм с комментариями? Я не могу сделать это сам. Я потратил на это по крайней мере 3 часа и ничего.
Большое спасибо!
1 ответ
Сохраняет вектор 'v[x] = y', где y - наименьший элемент исходной последовательности, который дает самую длинную увеличивающуюся подпоследовательность длины x. Первоначально у вас есть только v[0] = -inf
,
Пройдите последовательность для элемента a
посмотрите в векторе v
используя бинарный поиск. Не найдешь a
точно, но самый большой x
такой, что v[x] <= a
(<если оно строго увеличивается). Таким образом, самая длинная возрастающая подпоследовательность, которая заканчивается на воле, будет иметь длину x+1
, Теперь обновите v[x+1]
быть (это не может быть меньше, чем, иначе ваш поиск должен иметь возврат x+1
), вам может понадобиться расширить вектор.
Длина LIS - это размер вектора. Отслеживайте, какие позиции вы использовали, если вам нужно восстановить решение.