Cod sursa(job #2205372)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 18 mai 2018 21:54:40
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long int lint;

void add(pair <int, vector <int> > &where, const pair <int, int> &val) {
    if (val.first < where.first)
        where = {val.first, {val.second}};
    else if (val.first == where.first)
        where.second.push_back(val.second);
}

map <pair <int, int>, lint> Map;

lint DEI(const vector <int> &v, int i, int j) {
    if (j - i < 3)
        return 0;
    if (Map.count({i, j}))
        return Map[{i, j}];
    Map[{i, j}] = -1;

    pair <int, vector <int> > minimum(v[i + 1], {i + 1});
    for (int k = i + 2; k < j - 1; ++ k)
        add(minimum, {v[k], k});
        //minimum.second.push_back(k);

    lint ans = numeric_limits <lint> :: max();
    for (const int k: minimum.second)
        ans = min(ans, DEI(v, i, k + 1) + DEI(v, k, j) + 1LL * v[i] * v[k] * v[j - 1]);
    Map[{i, j}] = ans;
    return ans;
}

lint solve(const vector <int> &v) {
    return DEI(v, 0, v.size());
}

int main() {
    freopen("podm.in", "r", stdin);
    freopen("podm.out", "w", stdout);

    int N;
    cin >> N;
    vector <int> v(N + 1);
    for (int i = 0; i <= N; ++ i)
        cin >> v[i];
    set <int> s(v.begin(), v.end());
    assert(s.size() == v.size());
    cout << solve(v) << endl;
    return 0;
}