fbpx

Problema #395 – Comori – Rezolvari PBInfo

de Mihai-Alexandru

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;
}
Comentarii

S-ar putea sa iti placa