Загрузка данных


#include <iostream>
#include <algorithm>

using namespace std;

void wypisz(int **A, int n){
    for(int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            cout << A[i][j] << " ";
        }
        cout << "\n";
    }
}

int max_suma(int **A, int n){
    // Tworzymy tablicę do programowania dynamicznego o rozmiarze (n+1) x (n+1)
    int **dp = new int *[n + 1];
    for(int i = 0; i <= n; i++){
        dp[i] = new int[n + 1]();
    }
    
    // Wypełniamy tablicę dp od lewego górnego rogu (1,1) do prawego dolnego (n,n)
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(i == 1 && j == 1){
                dp[i][j] = A[i][j];
            } else {
                int z_gory = (i > 1) ? dp[i - 1][j] : 0;
                int z_lewej = (j > 1) ? dp[i][j - 1] : 0;
                dp[i][j] = A[i][j] + max(z_gory, z_lewej);
            }
        }
    }
    
    int wynik = dp[n][n];
    
    // Czyszczenie pamięci tablicy dp
    for(int i = 0; i <= n; i++){
        delete[] dp[i];
    }
    delete[] dp;
    
    return wynik;
}

void wczytajLepsze(int **A, int n){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cin >> A[i][j];
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    if (!(cin >> n)) return 0;
    
    int **A = new int *[n + 1];
    for(int i = 0; i <= n; i++){
        A[i] = new int[n + 1]();
    }
    
    wczytajLepsze(A, n);
    
    cout << max_suma(A, n) << "\n";
    
    for(int i = 0; i <= n; i++){
        delete[] A[i];
    }
    delete[] A;
    
    return 0;
}