Cerinţa
Se consideră o clădire de formă dreptunghiulară formată din n*m
camere, dispuse pe n
linii și m
coloane. Pentru a intra într-o cameră se plătește o sumă cunoscută, exprimată în lei. Intrarea în clădire este în camera de coordonate (1,m)
, iar ieșirea în camera de coordonate (n,1)
. Din orice cameră (i,j)
se poate ajunge numai în camerele (i+1,j)
sau (i,j-1)
, fără a părăsi clădirea.
Dom’ Profesor intră în clădire având asupra lui o sumă S
, parcurge un șir de camere după regula precizată și iese din clădire, plătind în fiecare cameră taxa corespunzătoare. Determinați suma maximă pe care o poate avea Dom’ Profesor după ce iese din clădire.
Date de intrare
Fişierul de intrare cladire5.in
conţine pe prima linie numerele n m S
. Fiecare dintre următoarele n
linii conține câte m
numere naturale, reprezentând taxele care trebuie plătite pentru fiecare cameră.
Date de ieşire
Fişierul de ieşire cladire5.out
va conţine pe prima linie numărul R
, suma maximă pe care o poate avea Dom’ Profesor după ce traversează clădirea.
Restricţii şi precizări
1 ≤ n , m ≤ 200
;- pentru fiecare cameră taxa este cel mult
100
.
Exemplu
cladire5.in
3 4 20 1 1 5 2 3 4 2 1 1 1 8 2
cladire5.out
9
Explicație
Suma minimă pe care trebuie să o plătească Dom’ Profesor este de 11
lei. O parcurgere la care se plătesc 11
lei este:
1 | 1 | 5 | 2 |
3 | 4 | 2 | 1 |
1 | 1 | 8 | 2 |
Deoarece la intrare Dom’ Profesor avea 20
de lei, ia ieșire va mai avea 9
lei.
#include <bits/stdc++.h> using namespace std; ifstream cin("cladire5.in"); ofstream cout("cladire5.out"); int n , m , a[201][201] , maxi , b[201][201] , sum; struct poz { int i , j; }rasp[401]; bool inside(int i , int j) { return i >= 1 && i <= n && j >= 1 && j <= m; } int main() { cin >> n >> m >> sum; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ; j++) cin >> a[i][j]; } for(int i = n ; i > 0 ; i--) { for(int j = 1 ; j <= m ; j++) { if(inside(i , j - 1) && inside(i + 1 , j)) a[i][j] += min(a[i][j - 1] , a[i + 1][j]); else if(inside(i , j - 1)) a[i][j] += a[i][j - 1]; else if(inside(i + 1 , j)) a[i][j] += a[i + 1][j]; //cout << a[i][j] << " " << i << " " << j << '\n';; } } cout << sum - a[1][m] << '\n'; }