Cerința
Fermierul Gigel are o livadă cu peri de forma unui triunghi dreptunghic cu laturile de câte n
peri fiecare și având perii organizați pe linii și coloane. Pe prima linie este un singur păr, pe a doua doi peri, etc. Pe ultima linie sunt n
peri. Pentru fiecare păr se cunoaște numărul de pere din el. Hoțul Dorel intră în livada lui Gigel prin colțul stânga jos, adică prin primul element al ultimei linii. El se poate deplasa paralel cu rândurile de peri, adică cu liniile, respectiv cu coloanele livezii. Astfel, dintr-o poziție aflată pe linia i
și coloana j
, Dorel poate merge pe linia i-1
și coloana j
sau pe linia i
și coloana j+1
. Ca să nu îl prindă Gigel, hoțul Dorel trebuie ia toate perele din perii de pe traseul pe care merge, să iasă pe la sfârșitul unei linii de peri și să fure un număr minim de pere (deoarece nu e lacom sau nu le poate duce și îl prinde Gigel).
Date de intrare
Fișierul de intrare livada_xi.in
conține pe prima linie numărul n
. Fiecare dintre următoarele n
linii conține câte o linie a triunghiului. Prima linie conține un număr, a doua linie conține 2
numere, etc. ultima linie n
, conține n
numere
Date de ieşire
Fișierul de ieșire livada_xi.out
va conține pe prima linie numărul S
, reprezentând cel mai mic număr de pere pe care le poate lua Dorel.
Restricții și precizări
1 ≤ n ≤ 100
- numărul de pere din fiecare păr este mai mic decât
1000
Exemplu
livada_xi.in
5 4 1 4 2 1 3 6 4 4 4 4 5 2 2 7
livada_xi.out
16
Explicație
16
se poate obține adunând numerele:
4 | ||||
1 | 4 | |||
2 | 1 | 3 | ||
6 | 4 | 4 | 4 | |
4 | 5 | 2 | 2 | 7 |
#include <bits/stdc++.h> using namespace std; ifstream cin("livada_xi.in"); ofstream cout("livada_xi.out"); # define inf 1000000001 int n, a[102][102], d[102][102]; int main(){ cin >> n; for(int i = 1; i <= n; ++i) for(int j = 1; j <= i; ++j) cin >> a[i][j], d[i][j] = inf; for(int j = 1; j <= n; ++j) d[n][j] = d[n][j-1] + a[n][j]; for(int i = n; i >= 1; --i) d[i][1] = d[i+1][1] + a[i][1]; for(int i = n-1; i >= 1; --i) for(int j = 2; j <= i; ++j){ if(d[i+1][j] + a[i][j] < d[i][j]) d[i][j] = d[i+1][j] + a[i][j]; if(d[i][j-1] + a[i][j] < d[i][j]) d[i][j] = d[i][j-1] + a[i][j]; } int min = inf; for(int i = 1; i <= n; ++i) if(d[i][i] < min) min = d[i][i]; cout << min; return 0; }