2016-12-22 7 views
1

Как найти разницу между последним и первым элементом самой длинной увеличивающейся подпоследовательности, так что значение (последний элемент - первый элемент) в LIS является максимум?Самая длинная возрастающая подпоследовательность такая, что последний элемент в LIS максимальный

+0

вопрос не ясен для меня. предположим, что у нас есть 1 100,0,1,2,3,4,5,6, то в чем же ответ? 1,100 или 0,1,2,3,4,5,6 –

+0

@SaeedAmiri здесь ответ должен быть 0,1,2,3,4,5,6 –

+0

@domen пытается с помощью DP soluiton, где при индексе i th он сохраняет значение до тех же самых idex с максимальной длиной и наибольшим значением, заканчивающимся на позиции i th. –

ответ

1

Давайте используем стандартное решение динамического программирования, в котором мы определяем f[i] как самую длинную возрастающую подпоследовательность, заканчивающуюся в элементе i-th. Мы можем сохранить пару (max length, smallest first element) для каждого i. Можно показать, что это приводит к правильному глобальному решению (интуитивно, это правильно, поскольку оно по-прежнему сохраняет оптимальное решение для всех подпоследовательностей, заканчивающихся в конкретном элементе, и тот факт, что один префикс «лучше», чем другой, означает, что общая подпоследовательность лучше).

Вы также можете сделать это O(N log N), сохранив эти пары в эффективной структуре данных (например, дереве сегментов), если требования к производительности высоки.

0

Очень наивный алгоритм выглядит следующим образом:

  1. В первом проходе найти все максимальные последовательные подпоследовательности и их длину поддерживать максимальную длину (просто сохранить номер для этого).
  2. Во втором проходе найдите начальную и конечную разности всех последовательностей максимальной длины и выведите максимальную среди всех из них.

Все это в O (n), это возможно сделать за один проход. Чтобы упростить это, я разбиваю его на два шага.