Maksimalni zbir na putu kroz matricu — rešenje
Uvod
U ovom zadatku radimo sa kvadratnom tabelom dimenzija n × n čija su polja popunjena ciframa od 0 do 9. Igrač počinje u gornjem levom uglu tabele i može da se kreće samo udesno ili nadole, po jedno polje u jednom koraku. Cilj je doći do donjeg desnog ugla tabele na način da zbir vrednosti polja kroz koja igrač prolazi bude maksimalan.
Naivni pristup problemu podrazumeva isprobavanje svih mogućih puteva od početka do kraja tabele. Svaki put se sastoji od tačno 2n−2 koraka, gde je svaki korak ili desno ili nadole. Ovo vodi do eksponencijalnog broja puteva, približno 2^(2n−2), što je izvodljivo samo za male dimenzije matrice, npr. do 10.
Efikasniji pristupi se oslanjaju na dinamičko programiranje. U top-down pristupu sa memoizacijom, za svako polje (i,j) pamti se maksimalni zbir do cilja. Ako je vrednost za neko polje već izračunata, ne računa se ponovo, čime se smanjuje broj operacija i kompleksnost postaje O(n^2). Bottom-up pristup formira DP matricu gde dp[i][j] predstavlja maksimalan zbir do polja (i,j) od početnog polja (0,0), koristeći rekurentnu formulu dp[i][j] = mat[i][j] + max(dp[i-1][j], dp[i][j-1]). Ovaj metod je vrlo efikasan i praktičan za sve n ≤ 30.
Postoji i optimizacija memorije u DP rekurenciji: za izračunavanje dp[i][j] potrebni su samo prethodni i tekući red, što smanjuje potrošnju memorije sa O(n^2) na O(n). Alternativno, heuristički backtracking sa pruning-om može se koristiti za praktičnu akceleraciju, ali je i dalje inferioran u odnosu na DP i uglavnom služi za ilustraciju koncepta.
Zaključak: za matrice dimenzija do 30×30 najbolji izbor je dinamičko programiranje, bilo bottom-up ili top-down sa memoizacijom. Brute force i backtracking su korisni uglavnom za edukaciju i male dimenzije, dok optimizacija memorije predstavlja finu doradu za veće tabele.
Rešenje 1 — Backtracking bez optimizacije
Pokušajte najpre da sami razmislite kako biste obišli sve moguće puteve u matrici. Ovaj zadatak je odličan za vežbu backtracking pristupa i razumevanje eksponencijalne složenosti.
Ovo rešenje koristi jednostavan backtracking pristup, gde se isprobavaju svi mogući putevi od gornjeg levog do donjeg desnog ugla matrice. U svakom koraku moguće je kretanje nadole ili udesno, a trenutni zbir se akumulira.
Iako je idejno vrlo jednostavno, ovaj pristup ima ekstremno lošu efikasnost jer broj puteva raste eksponencijalno sa veličinom matrice.
Rešenje 2 — Rekurzija sa memoizacijom (Top-Down DP)
Pokušajte prvo da razmislite kako biste izbegli ponovno računanje istih putanja u matrici. Ovaj zadatak uvodi jednu od ključnih ideja dinamičkog programiranja — memoizaciju.
Ovo rešenje koristi rekurziju uz memoizaciju kako bi se izbeglo ponavljanje izračunavanja za ista polja matrice. Funkcija maxZbir(i,j) računa maksimalan zbir od pozicije (i,j) do donjeg desnog ugla.
Ako je rezultat za neko polje već izračunat, on se odmah preuzima iz memorije, što značajno smanjuje broj operacija.
Složenost ovog pristupa je O(n²), jer se svako polje računa najviše jednom.
Rešenje 3 — Dinamičko programiranje (Bottom-Up)
Uvod i opis problema
Treća varijanta rešenja koristi dinamičko programiranje u bottom-up pristupu. Cilj je izračunati maksimalan zbir puta od gornjeg levog do donjeg desnog ugla matrice dimenzija n × n. Svaki korak može biti desno ili nadole, a vrednosti polja se akumuliraju. Za razliku od rekurzije sa memoizacijom, bottom-up pristup gradi DP matricu iterativno, izbegavajući rekurzivne pozive.
Ideja rešenja
Glavna ideja je kreirati pomoćnu DP matricu dp[i][j] koja za svako polje (i,j) čuva maksimalan zbir puta od početnog polja (0,0) do tog polja. Prvo se inicijalizuju vrednosti za početno polje, prvu vrstu i prvu kolonu. Zatim se iterativno popunjavaju ostala polja matrice koristeći formulu dp[i][j] = mat[i][j] + max(dp[i-1][j], dp[i][j-1]). Nakon popunjavanja cele DP matrice, rezultat se nalazi u dp[n-1][n-1].
Opis algoritma (idejna struktura dijagrama)
Algoritam se može prikazati sledećim koracima:
- Početak: učitaj dimenziju
ni matricumat[n][n]. - Inicijalizacija DP matrice:
- Postavi
dp[0][0] = mat[0][0]. - Popuni prvu vrstu i prvu kolonu DP matrice.
- Postavi
- Glavna petlja: za svako polje
(i,j)gde su1 ≤ i,j ≤ n-1, izračunajdp[i][j] = mat[i][j] + max(dp[i-1][j], dp[i][j-1]). - Rezultat:
dp[n-1][n-1]sadrži maksimalan zbir puta.
Dijagram toka algoritma je prikazan na slici 1.
Rešenje 3 — Dinamičko programiranje (Bottom-Up DP)
Pokušajte da sami razmislite kako biste rešili problem bez rekurzije, tako što biste postupno gradili optimalna rešenja od početka matrice. Ovo je klasičan primer dinamičkog programiranja.
U ovom pristupu kreiramo DP matricu dp[i][j] koja čuva maksimalan zbir od početnog polja (0,0) do polja (i,j).
Ideja je da se svako polje izračunava na osnovu prethodno izračunatih vrednosti (gore i levo), čime se izbegava rekurzija i ponavljanje računanja.
Kompleksnost ovog pristupa je O(n²) i predstavlja standardno
optimalno rešenje za ovaj problem.
|< Priprema za drzavno takmičenje i SIO