Cod sursa(job #2740423)

Utilizator Mihai_BarbuMihai Barbu Mihai_Barbu Data 12 aprilie 2021 21:43:26
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

#define ull unsigned long long

using namespace std;

ifstream fin("podm.in");
ofstream fout("podm.out");

int main() {
    int N;
    int i, j;

    fin >> N;

    vector<int> dim(N + 1);
    vector<vector<ull>> dp(N + 1, vector<ull>(N + 1));

    for (i = 0; i <= N; ++i) {
        fin >> dim[i];
    }

    // base cases
    for (i = 1; i < N; ++i) {
        dp[i][i] = 0;
        dp[i][i + 1] = 1ULL * dim[i - 1] * dim[i] * dim[i + 1];
    }
    dp[N][N] = 0;

    /** 
     * dp[i][j = i + d] = min{dp[i][k] + dp[k + 1][j] + dim[i - 1] * dim[k] * dim[j]}
     *                          -- M_ij = M_ik * M_(k + 1)j
     */
    int d, k;

    for (d = 1; d < N; ++d) {
        for (i = 1; i <= N - d; ++i) {
            j = i + d;
            
            dp[i][j] = ULLONG_MAX;
            ull lr = 1ULL * dim[i - 1] * dim[j];

            for (k = i; k < j; ++k) {
                ull aux;

                aux = 0ULL + dp[i][k] + dp[k + 1][j] +
                      (1ULL * lr * dim[k]);
                    
                dp[i][j] = min(dp[i][j], aux);
            }
        }
    }

    fout << dp[1][N] << "\n";
    
    return 0;
}