fbpx

Problema #3256 – Livada_XI – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Fermierul Gigel are o livadă cu peri de forma unui triunghi dreptunghic cu laturile de câte n peri fiecare și având perii organizați pe linii și coloane. Pe prima linie este un singur păr, pe a doua doi peri, etc. Pe ultima linie sunt n peri. Pentru fiecare păr se cunoaște numărul de pere din el. Hoțul Dorel intră în livada lui Gigel prin colțul stânga jos, adică prin primul element al ultimei linii. El se poate deplasa paralel cu rândurile de peri, adică cu liniile, respectiv cu coloanele livezii. Astfel, dintr-o poziție aflată pe linia i și coloana j, Dorel poate merge pe linia i-1 și coloana j sau pe linia i și coloana j+1. Ca să nu îl prindă Gigel, hoțul Dorel trebuie ia toate perele din perii de pe traseul pe care merge, să iasă pe la sfârșitul unei linii de peri și să fure un număr minim de pere (deoarece nu e lacom sau nu le poate duce și îl prinde Gigel).

Date de intrare

Fișierul de intrare livada_xi.in conține pe prima linie numărul n. Fiecare dintre următoarele n linii conține câte o linie a triunghiului. Prima linie conține un număr, a doua linie conține 2 numere, etc. ultima linie n, conține n numere

Date de ieşire

Fișierul de ieșire livada_xi.out va conține pe prima linie numărul S, reprezentând cel mai mic număr de pere pe care le poate lua Dorel.

Restricții și precizări

  • 1 ≤ n ≤ 100
  • numărul de pere din fiecare păr este mai mic decât 1000

Exemplu

livada_xi.in

5
4
1 4
2 1 3
6 4 4 4
4 5 2 2 7

livada_xi.out

16

Explicație

16 se poate obține adunând numerele:

4
1 4
2 1 3
6 4 4 4
4 5 2 2 7
#include <bits/stdc++.h>
using namespace std;

ifstream cin("livada_xi.in");
ofstream cout("livada_xi.out");

# define inf 1000000001

int n, a[102][102], d[102][102];

int main(){
    cin >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= i; ++j)
            cin >> a[i][j], d[i][j] = inf;
    for(int j = 1; j <= n; ++j)
        d[n][j] = d[n][j-1] + a[n][j];
    for(int i = n; i >= 1; --i)
        d[i][1] = d[i+1][1] + a[i][1];
    for(int i = n-1; i >= 1; --i)
        for(int j = 2; j <= i; ++j){
            if(d[i+1][j] + a[i][j] < d[i][j])
                d[i][j] = d[i+1][j] + a[i][j];
            if(d[i][j-1] + a[i][j] < d[i][j])
                d[i][j] = d[i][j-1] + a[i][j];
        }
    int min = inf;
    for(int i = 1; i <= n; ++i)
       if(d[i][i] < min)
            min = d[i][i];
    cout << min;
    return 0;
}
Comentarii

S-ar putea sa iti placa