fbpx

Problema #3259 – SumTri_XI – Rezolvari PBInfo

de Mihai-Alexandru

Cerinţa

Se consideră un triunghi de numere întregi format din n linii. Prima linie conține un număr, a doua linie conține 2 numere, etc. ultima linie n, conține n numere. În acest triunghi se pot calcula diverse sume cu n elemente, în funcție de modul de parcurgere a numerelor din triunghi. Unul dintre aceste moduri este următorul:

  • se pleacă din ultimul element al ultimei linii
  • se merge întotdeauna spre stânga pe aceeași linie sau pe linia de deasupra, adică de pe linia i și coloana j se merge pe linia i și coloana j-1 sau pe linia i-1 și coloana j-1.
  • parcurgerile se termină pe prima coloană.

Să se determine cea mai mare sumă care se poate obține în acest mod.

Date de intrare

Fişierul de intrare sumtri_xi.in conţine pe prima linie numărul n. Fiecare dintre următoarele n linii conține câte o linie a triunghiului.

Date de ieşire

Fişierul de ieşire sumtri_xi.out va conţine pe prima linie numărul S, reprezentând cea mai mare sumă care se poate obține.

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • numerele din triunghi sunt din intervalul [-1000, 1000].

Exemplu

sumtri_xi.in

5
4
1 4
2 -1 3
9 4 4 3
4 5 -2 2 1 

sumtri_xi.out

21

Explicație

Suma 21 se poate obține adunând numerele:

4
1 4
2 -1 3
9 4 4 3
4 5 -2 2 1

#include <bits/stdc++.h>
using namespace std;

ifstream cin("sumtri_xi.in");
ofstream cout("sumtri_xi.out");

int n , a[105][105] , maxi = -999999999;

int main()
{
    cin >> n;

    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= i ; j++)
            cin >> a[i][j];

    for(int i = n; i >= 1 ; i--)
        for(int j = i ; j >= 1 ; j--)
            if(i == j) a[i][j] += a[i + 1][j + 1];
             else if(i == n) a[i][j] += a[i][j + 1];
                else   a[i][j] += max(a[i][j + 1] , a[i + 1][j + 1]);


    for(int i = 1 ; i <= n ; i++)
        if(a[i][1] > maxi) maxi = a[i][1];

    cout << maxi;

}
Comentarii

S-ar putea sa iti placa