Ciąg A=(a1,…,an)
Output
Najdłuższy rosnący podciąg A.
Podciągiem ciągu A nazywamy ciąg (ai1,…,aik), gdzie 1≤i1<⋯<ik≤n, jeśli dodatkowo ma on być rosnący to ai1<⋯<aik.
Przykład A
Mamy A=(5,2,8,5,3,7,9,8).
Wówczas najdłuższy pociąg A to np. (2,3,7,9), ale istnieją również inne podciągi tej samej długości np. (2,5,7,8).
Steps
- Budujemy DAG G=(V,E,c) odpowiadającego naszemu problemowi.
- Niech zbiór wierzchołków stanowią elementy ciągu wejściowego A: V={a1,…,an}.
- Wstawiamy krawędzie tylko pomiędzy wierzchołkami, które mogą być kolejnymi elementami rosnącego podciągu, czyli (ai,aj)∈E jeśli i<j∧ai<aj.
- Niech waga (długość) każdej krawędzi będzie równa 1, czyli ∀(u,v)∈E:c(u,v)=1.
Zauważmy, że tak powstały graf G jest DAG-iem oraz, że ścieżki w tak zdefiniowanym grafie odpowiadają podciągom rosnącym ciągu A. Zatem naszym zadaniem teraz jest znalezienie najdłuższej ścieżki w tak zdefiniowanym grafie.
Znalezienie najdłuższej ścieżki
Niech L(i) będzie długością najdłuższego podciągu kończącego się na elemencie ai, wówczas:
for i = 1 to n:
L(i) = 1 + max{ L(j): (j,i) in E }
return max{ L(i): i in [n] }
Podobnie jak w problemie najkrótszej ścieżki w DAG, jeśli zapamiętamy aj dla którego osiągnięty jest max{L(j):(j,i)∈E} to możemy odtworzyć uzyskany w wyniku podciąg.
Złożoność obliczeniowa powyższego algorytmu wynosi O(∣E∣) (podobnie jak to było w przypadku najkrótszych ścieżek w DAG), czyli w pesymistycznym przypadku O(n2), który zachodzi jeśli ciąg wejściowy jest posortowany rosnąco.