Ограниченная длинная возрастающая подпоследовательность
Рассмотрим массив, который имеет N
целые числа. Теперь нам дают индекс i
, который может принимать значения от 1
через N
, Этот конкретный индекс всегда должен присутствовать в LIS, который мы генерируем. Рассчитать LIS для каждого значения в i
,
Как мы можем эффективно решить вышеуказанную проблему? Мое простое решение состоит в том, чтобы изменить индекс i
для всех его значений и расчета LIS. Временная сложность возрастает до O (N2 log (N)). Это может быть побито?
Пример:
N = 2. я = 1
Скажем, данный массив [1,2].
[1,2]
или же [2, 2]
Самая длинная (строго) возрастающая подпоследовательность в каждом случае 2
а также 1
,
2 ответа
Каноническая динамическая программа для LIS вычисляет, для каждого k
, самая длинная возрастающая подпоследовательность элементов в индексе 1..k
который включает в себя элемент в индексе k
, Используя эти данные и данные зеркального отображения для максимально увеличивающихся подпоследовательностей k..n
мы находим LIS, который включает в себя индекс k
как союз самых старых k
и самый длинный после k
,
O(n log n)
Наличие индекса i, который должен быть в подпоследовательности, облегчает задачу просмотра влево и вправо и определения того, как далеко вы можете пойти, чтобы оставаться строго возрастающим. Это займет не более O(N) шагов.
Прямое решение теперь просто повторяет это для всех N значений в индексе i, что дает общее усилие O(N^2).
Но обратите внимание, что при изменении значения по индексу i вычисления, сделанные ранее, могут быть использованы повторно. Необходимо только проверить, может ли последовательность быть расширена за пределы i в любом направлении или нет. Если да, вы уже знаете, как далеко (или можете рассчитать его сейчас раз и навсегда).
Это сводит общее усилие к O(N).