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.
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