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.

Slika 5: Primer najveće kvadratne podmatrice čiji su elementi samo 0<br />

podmatrice dimenzije k. Taj uslov možemo proveriti preko d[x − 1][y − 1] ≥ k − 1. Dakle, dobijamo<br />

{ 0, ukoliko je matrix[x][y] = 1<br />

d[x][y] =<br />

1 + min{d[x − 1][y], d[x][y − 1], d[x − 1][y − 1]}, ukoliko je matrix[x][y] = 0<br />

gde naravno moramo paziti da navedeni indeksi pripadaju matrici. Na početku možemo izračunati<br />

vrednosti u prvoj vrsti i koloni ili dodatni veštačke 0-te vrste i kolone. Ukoliko elemente matrice d<br />

računamo kretanjem po vrstama sa leva na desno u trenutku računanja elementa na poziciji (x, y)<br />

potrebne vrednosti sa desne strane jednakosti će biti već izračunate.<br />

Zadatak 5.2 (TopCoder, SRM 255) Dati su brojevi 0 M < N 1.000.000. Odrediti najmanji<br />

broj sastavljen samo od neparnih cifara, koji pri deljenju sa N daje ostatak M. Ukoliko traženi broj<br />

ne postoji, štampati −1.<br />

Rešenje: Kako konstruisati sve brojeve sastavljene od neparnih cifara Postoji tačno pet takvih<br />

jednocifrenih brojeva: 1, 3, 5, 7 i 9. Da bi dobili brojeve sa L neparnih cifara, dovoljno je pomnožiti<br />

svaki od (L − 1)–cifrenih brojeva sastavljenih od neparnih cifara, sa 10 i dodati svaku od neparnih<br />

cifara.<br />

Za rešenje će nam biti potreban jedan red q. Na početku ubacimo sve jednocifrene neparne brojeve<br />

u q. Zatim dodajemo sve neparnocifrene brojeve koji su dobijeni od 1, zatim sve neparnocifrene brojeve<br />

dobijene od 3 i tako dalje. Time ćemo konstruisati sve neparnocifrene brojeve u rastućem redosledu.<br />

Naravno, sve brojeve uzimamo po modulu N.<br />

Nema smisla imati dva broja sa jednakim ostatkom u nizu q, pošto će oni generisati iste neparnocifrene<br />

brojeve. Zato koristimo niz d dužine N. Naime, d[i] predstavlja najmanji broj koji pri deljenju<br />

sa N daje ostatak i. Na početku, inicijalizujemo elemente niza d na −1. Možemo primetiti da ne<br />

moramo pamtiti cele brojeve (pošto mogu biti sastavljeni od mnogo cifara), već je dovoljno pamtiti<br />

poslednju cifru i prethodnika.<br />

Memorijska i vremenska složenost ovog algoritma je O(N).<br />

Zadatak 5.3 (Srbija, Republičko takmičenje 2003) Dat je niz različitih prirodnih brojeva dužine<br />

n. Nad nizom možete izvršavati dve operacije: proizvoljan element iz niza prebacite na njegov<br />

početak ili na njegov kraj. Odrediti minimalni broj operacija, tako da rezultujući niz bude rastući.<br />

Rešenje: Označimo dati niz sa a i pretpostavimo da smo pri simulaciji sortiranja pomerili<br />

elemente sa indeksima 1 ≤ x 1 < . . . < x k ≤ n. Elemente koje nismo premestili zadržali su svoj<br />

poredak kao i na početku. Kako na kraju treba dobiti sortirani niz, poredak nepremeštanih elemenata<br />

mora biti sortiran. Ova činjenica nas navodi na to da treba pronaći najduži rastući podniz niza.<br />

Med¯utim, primetimo da se nijedan novi element ne može ubaciti izmed¯u neka dva elementa koja nismo<br />

premeštali. Zato nalazimo najduži rastući podniz niza a uzastopnih elemenata (ne po indeksima već<br />

po vrednostima).<br />

15

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

Saved successfully!

Ooh no, something went wrong!