Cerinţa
Ali Baba și cei 40 de hoți stăpânesc un deșert de formă dreptunghiulară, împărțit în n
linii și m
coloane, care definesc n*m
sectoare. Intrarea într-un sector se plătește cu o taxă cunoscută, exprimată în galbeni.
Un călător trebuie să traverseze deșertul de la Est la Vest, trecând dintr-un sector în altul, astfel: din sectorul (i j)
se poate ajunge în unul din sectoarele (i-1,j-1)
, (i,j-1)
sau (i+1,j-1)
, dar fără a părăsi deșertul (ar fi omorât de oamenii lui Ali Baba). La trecerea printr-un sector, călătorul plătește taxa aferentă acelui sector.
Determinați suma totală minimă pe care trebuie să o plătească călătorul la traversarea deșertului, știind că pleacă din orice sector al coloanei m
(Est) și se oprește în orice sector al coloanei 1
(Vest), cu respectarea condițiilor de mai sus.
Date de intrare
Fişierul de intrare taxe.in
conţine pe prima linie numerele n m
. Următoarele n
linii conțin câte m
numere naturale, reprezentând valorile taxelor pentru fiecare sector.
Date de ieşire
Fişierul de ieşire taxe.out
va conţine pe prima linie numărul S
, reprezentând suma minimă care trebuie plătită.
Restricţii şi precizări
1 ≤ n,m ≤ 200
- valoarea fiecărei taxe este un număr natural mai mic decât
100
Exemplu
taxe.in
4 5 5 8 3 7 7 1 1 4 5 1 5 8 9 1 7 5 8 6 6 9
taxe.out
8
Explicație
Un traseu în care se plătesc 8
galbeni este:
5 | 8 | 3 | 7 | 7 |
1 | 1 | 4 | 5 | 1 |
5 | 8 | 9 | 1 | 7 |
5 | 8 | 6 | 6 | 9 |
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 Taxe:
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
#define NN 205
#define INFINIT 1000000000
ifstream fin("taxe.in");
ofstream fout("taxe.out");
int n, m, a[NN][NN], s[NN][NN];
int Minim(int x , int y){
return x<y ? x : y;
}
int Minim(int x, int y, int z)
{
return Minim(Minim(x , y) , z);
}
int main(){
assert(fin >> n >> m);
for(int i=1 ; i<=n ; ++i)
for(int j=1 ; j<=m ; j++)
assert(fin >> a[i][j]);
for(int i=1;i<=n;++i)
s[i][m] = a[i][m];
for(int j = 1 ; j <= m ; ++j)
s[0][j] = s[n+1][j] = INFINIT;
for(int j=m-1 ; j>=1 ; j--)
for(int i = 1 ; i <= n ; ++i)
s[i][j] = a[i][j] + Minim(s[i-1][j+1], s[i][j+1], s[i+1][j+1]);
int pmin = 1;
for(int i = 2 ; i <= n ; ++i)
if(s[i][1] < s[pmin][1])
pmin = i;
fout << s[pmin][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 #432 Taxe
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #432 Taxe 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!