fbpx

Problema #432 – Taxe – Rezolvari PBInfo

de Mihai-Alexandru

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;
}
Comentarii

S-ar putea sa iti placa