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 coloanaj
se merge pe liniai
și coloanaj-1
sau pe liniai-1
și coloanaj-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; }