Cerinţa
Ali Baba și cei 40 de hoți stăpânesc un deșert de formă dreptunghiulară, împărțit în n
linii și m
coloane, care definesc n*m
sectoare. În fiecare sector se află o comoară ascunsă de Ali Baba. Se cunoaște valoarea în galbeni a fiecărei comori.
Un călător trebuie să traverseze deșertul de la Nord la Sud, trecând dintr-un sector în altul, astfel: din sectorul (i j)
se poate ajunge în unul din sectoarele (i+1,j-1)
, (i+1,j)
sau (i+1,j+1)
, dar fără a părăsi deșertul (ar fi omorât de oamenii lui Ali Baba). La trecerea printr-un sector, călătorul colectează comoara din acel sector.
Determinați valoarea totală maximă a comorilor pe care le poate colecta călătorul la traversarea deșertului, știind că pleacă din orice sector al liniei 1
(Nord) și se oprește în orice sector al linei n
(Sud), cu respectarea condițiilor de mai sus.
Date de intrare
Fişierul de intrare comori.in
conţine pe prima linie numerele n m
. Următoarele n
linii conțin câte m
numere naturale, reprezentând valorile comorilor din fiecare sector.
Date de ieşire
Fişierul de ieşire comori.out
va conţine pe prima linie numărul V
, reprezentând valoarea maximă a comorilor care pot fi colectate.
Restricţii şi precizări
1 ≤ n,m ≤ 200
- valoarea fiecărei comori este un număr natural mai mic decât
100
Exemplu
comori.in
4 5 5 8 3 7 7 1 1 4 5 1 5 8 9 1 7 5 8 6 6 9
comori.out
29
Explicație
Un traseu prin care se colectează comori în valoare de 29
galbeni este:
5 | 8 | 3 | 7 | 7 |
1 | 1 | 4 | 5 | 1 |
5 | 8 | 9 | 1 | 7 |
5 | 8 | 6 | 6 | 9 |
#include <bits/stdc++.h> using namespace std; ifstream cin("comori.in"); ofstream cout("comori.out"); int n , m , a[204][204] , s[204][204]; int main() { cin >> n >> m; for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= m ; j++) cin >> a[i][j]; for(int i = 1 ; i <= n ; ++i) s[1][i] = a[1][i]; for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; ++j) { s[i][j] = a[i][j] + max(max(s[i - 1][j-1], s[i - 1][j]) , s[i - 1][j + 1]); //cout << s[i][j] << " " << i << " " << j << '\n'; } int pmin = 1; for(int j = 2 ; j <= m ; ++j) if(s[n][j] > s[n][pmin]) pmin = j; cout << s[n][pmin]; return 0; }