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 |
#include <bits/stdc++.h> using namespace std; ifstream cin("taxe.in"); ofstream cout("taxe.out"); int n , m , a[201][201] , b[201][201] , sol; int main() { cin >> n >> m; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> a[i][j]; for(int i = 0 ; i < n; i++) b[i][0] = a[i][0]; for(int j = 1; j < m; j++) { b[0][j] = a[0][j] + min(b[0][j - 1], b[1][j - 1]); for (int i = 1; i + 1 < n; i++) b[i][j] = a[i][j] + min(min(b[i - 1][j - 1], b[i][j - 1]), b[i + 1][j - 1]); b[n - 1][j] = a[n - 1][j] + min(b[n - 2][j - 1], b[n - 1][j - 1]); } sol = b[0][m - 1]; for(int i = 1; i < n; i++) sol = min(sol, b[i][m - 1]); cout << sol; return 0; }