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.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Cladire5:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>
using namespace std;
#define NN 205
ifstream fin("cladire5.in");
ofstream fout("cladire5.out");
int n, m, a[NN][NN], s[NN][NN] , S;
int main(){
assert(fin >> n >> m >> S);
for(int i=1 ; i<=n ; ++i)
for(int j=1 ; j<=m ; j++)
assert(fin >> a[i][j]);
s[1][m] = a[1][m];
for(int i=2;i<=n;++i)
s[i][m] = s[i-1][m] + a[i][m];
for(int j=m-1 ; j >= 1 ; --j)
s[1][j] = s[1][j+1] + a[1][j];
for(int i = 2 ; i<=n ; ++i)
for(int j = m - 1 ; j>=1 ; --j)
if(s[i-1][j] <s[i][j+1])
s[i][j] = s[i-1][j] + a[i][j];
else
s[i][j] = s[i][j+1] + a[i][j];
fout << S - s[n][1] << "
";
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1384 Cladire5
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1384 Cladire5 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!