11.01.2015 Views

Uvod u dinamicko programiranje

Uvod u dinamicko programiranje

Uvod u dinamicko programiranje

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!