Data je matrica celih brojeva dimenzije \(n \times m\). Moguće je započeti kretanje iz bilo kog polja prve vrste matrice i završiti ga u bilo kom polju poslednje vrste. U svakom koraku je moguće preći samo na polje dole, dole-desno ili dole-levo u odnosu na trenutno. Napisati program koji realizuje algoritam za određiva- nje maksimalnog zbira brojeva u poljima na putu koji se može ostvariti tokom jedne šetnje. Vremenska i prostorna složenost algoritma treba da budu O(\(n\cdot m\)).
Sa standardnog ulaza se učitavaju brojevi \(n\) i \(m\) (\(n, m \le 1000\)). Nakon toga se učitava matrica celih brojeva dimenzije \(n \times m\). Brojevi su manji od \(10^8\).
Na standardni izlaz ispisati jedan broj koji predstavlja traženi maksimalni zbir.
4 3 1 2 3 2 -4 2 3 0 -1 1 2 3
9
Najveći zbir se ostvaruje kretanjem redom kroz drugo polje prve vrste (2), prvo polje druge vrste (2), prvo polje treće vrste (3) i konačno drugo polje četvrte vrste (2).
Zadatak rešavamo dinamičkim programiranjem. U matrici dinamičkog programiranja, na polju (\(i, j\)) čuvamo maksimalni zbir koji se može pokupiti ako se krene iz bilo kog polja prve vrste i završi se na polju (\(i, j\)). Prva vrsta matrice dinamičkog programiranja se poklapa sa prvom vrstom matrice (pošto u svakom koraku moramo da se spustimo na sledeću vrstu, ako kretanje završavamo na polju iz prve vrste, tada ne pravimo ni jedan korak, pa samo kupimo vrednost koja se nalazi na tom polju). Što se ostalih polja tiče, analiziramo mogućnost da na njih stignemo sa polja gore-levo ((\(i − 1, j − 1\))), polja gore ((\(i − 1, j\))) i polja gore-desno ((\(i−1, j+1\))) i najbolju od te tri mogućnosti uvećavamo za vrednost na trenutnom završnom polju (\(i, j\)). Pri tom moramo voditi računa o rubnim slučajevima (prva i poslednja kolona), kada jedna od te tri mogućnosti nije dostupna.
Pošto se kretanje može završiti u bilo kom polju poslednje vrste, krajnji rezultat se određuje kao maksimum vrednosti upisanih u poslednju vrstu matrice dinamičkog programiranja. Prikazana je ulazna matrica i njoj odgovarajuća matrica dinamičkog programiranja.
\[ \begin{bmatrix} 1 & 2 & 3 \\ 2 & -4 & 2 \\ 3 & 0 & -1 \\ 1 & 2 & 3 \end{bmatrix} \quad \begin{bmatrix} 1 & 2 & 3 \\ 4 & -1 & 5 \\ 7 & 5 & 4 \\ 8 & 9 & 8 \end{bmatrix} \]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> mat(n, vector<int>(m));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> mat[i][j];
vector<vector<int>> dp(mat);
for (int i = 1; i < n; i++)
for (int j = 0; j < m; j++) {
int mp = dp[i - 1][j];
if (j > 0)
mp = max(mp, dp[i - 1][j - 1]);
if (j < m - 1)
mp = max(mp, dp[i - 1][j + 1]);
dp[i][j] = mp + mat[i][j];
}
int res = *max_element(begin(dp[n - 1]), end(dp[n - 1]));
cout << res << endl;
return 0;
}