Cod sursa(job #2500643)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 28 noiembrie 2019 13:53:43
Problema Parantezare optima de matrici Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

const int INF = 0x3f3f3f3f;

int main() {
    int n;
    in >> n;
    vector <int> d(n + 1);

    for (int i = 0; i < n + 1; i++) {
        in >> d[i];
    }

    // dp[i][j] - solutia optima pentru partea M[i] ... M[j]
    vector <vector <int64_t> > dp(n + 1, vector <int64_t> (n + 1, 0));

    for (int i = 1; i < n; i++) {
        dp[i][i + 1] = 1ll * d[i - 1] * d[i] * d[i + 1];
    }
    
    int64_t nr, min;
    for (int step = 2; step < n; step++) {
        for (int i = 1; i + step <= n; i++) {
            min = INF;
            for (int k = i; k < i + step; k++) {
                nr = dp[i][k] + 1ll* d[i - 1] * d[k] * d[i + step] + dp[k + 1][i + step];     
                if (min > nr)
                    min = nr;
            }
            dp[i][i + step] = min;
        }
    }

    out << dp[1][n] << '\n';
    return 0;
}