# PBinfo #432 – Taxe – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

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 


 .tbl-traseu td{ 	padding: 5px; border: solid 1px gray; }

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/432)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/432/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-432/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
