ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Задача 76271
Условие(из книги Д. Гриса) Дана последовательность целых чисел x[1],...,x[n]. Найти максимальную длину её возрастающей подпоследовательности (число действий порядка n log n).РешениеИскомая функция не индуктивна, но имеет следующее индуктивное расширение: в него входят помимо максимальной длины возрастающей подпоследовательности (обозначим её k) также и числа u[1], ..., u[k], где u[i] — минимальный из последних членов возрастающих подпоследовательностей длины i. Очевидно, u[1]≤...≤u[k]. При добавлении нового члена в x значения u и k корректируются.n1 := 1; k := 1; u[1] := x[1]; {инвариант: k и u соответствуют данному выше описанию} while n1 <> n do begin | n1 := n1 + 1; | ... | {i - наибольшее из тех чисел отрезка 1..k, для | которых u[i] < x[n1]; если таких нет, то i=0 } | if i = k then begin | | k := k + 1; | | u[k+1] := x[n1]; | end else begin {i < k, u[i] < x[n1] <= u[i+1] } | | u[i+1] := x[n1]; | end; end;Фрагмент ... использует идею двоичного поиска; в инварианте условно полагаем u[0] равным минус бесконечности, а u[k+1] — плюс бесконечности. Наша цель: u[i] < x[n1]≤u[i+1]. i:=0; j:=k+1; {u[i] < x[n1] <= u[j], j > i} while (j - i) <> 1 do begin | s := i + (j-i) div 2; {i < s < j} | if x[n1] <= u[s] then begin | | j := s; | end else begin {u[s] < x[n1]} | | i := s; | end; end; {u[i] < x[n1] <= u[j], j-i = 1} Замечание. Более простое (но не минимальное) индуктивное
расширение получится, если для каждого i хранить
максимальную длину возрастающей подпоследовательности,
оканчивающейся на x[i]. Это расширение приводит
к алгоритму с числом действий порядка
n2. Есть
и другой изящный алгоритм с квадратичным временем работы
(сообщил М.В.Вьюгин):
найти максимальную общую подпоследовательность исходной
последовательности и отсортированной
последовательности с помощью предыдущей задачи.
Источники и прецеденты использования |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|