Uvod u dinamicko programiranje
Uvod u dinamicko programiranje
Uvod u dinamicko programiranje
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
A i,j = najmanji mogući poslednji element svih rastućih nizova dužine j<br />
Primetimo da za svako i, važi<br />
koristeći elemente a[1], a[2], . . . , a[i]<br />
A i,1 < A i,2 < . . . < A i,j .<br />
Dakle, kada tražimo najduži rastući podniz koji se završava elementom a[i + 1] potrebno je da<br />
nad¯emo indeks j takav da je A i,j < a[i + 1] A i,j+1 . U tom slučaju će tražena dužina biti jednaka<br />
j +1 i A i+1,j+1 će biti jednako a i+1 dok će ostali elementi niza A i+1 ostati nepromenjeni. Zaključujemo<br />
da postoji najviše jedna razlika izmed¯u nizova A i i A i+1 . Kako je niz A i uvek sortiran i posle primene<br />
gornje operacije - možemo koristiti binarnu pretragu (eng. binary search).<br />
Algoritam H: Pseudo kod problema NRP<br />
Input: Niz a dužine n<br />
Output: LIS - najduži rastući podniz<br />
1 max = 1;<br />
2 LIS[1] = 0;<br />
3 for i ← 1 to n do<br />
4 if a[LIS[max]] < a[i] then<br />
5 p[i] = LIS[max];<br />
6 max = max + 1;<br />
7 LIS[max] = i;<br />
8 end<br />
9 else<br />
10 left = 0;<br />
11 right = max − 1;<br />
12 while (left < right) do<br />
13<br />
m = (left + right)/2;<br />
14<br />
if a[LIS[m]] < a[i] then<br />
15<br />
left = m + 1;<br />
16<br />
else<br />
17<br />
right = m;<br />
18<br />
end<br />
19 end<br />
20 if a[i] < a[LIS[left]] then<br />
21<br />
if left > 0 then<br />
22<br />
p[i] = LIS[left − 1];<br />
23<br />
end<br />
24<br />
LIS[left] = i;<br />
25 end<br />
26 end<br />
27 end<br />
28 i = LIS[max];<br />
29 for k ← max to 1 do<br />
30 i = p[i];<br />
31 LIS[k] = i;<br />
32 end<br />
33 return LIS;<br />
11