Cod sursa(job #2908101)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 1 iunie 2022 14:34:33
Problema Parantezare optima de matrici Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

#define vt vector
#define pb push_back
#define em emplace
#define emb emplace_back

using namespace std;

using ll = long long;
using ld = long double;
using ull = unsigned long long;


void re() {
}

void wr() {
}

template <typename fir, typename ...sec> void re(fir &x, sec&... y) {
    cin >> x;
    re(y...);
}

template <typename fir, typename ...sec> void wr(fir x, sec... y) {
    cout << x;
    wr(y...);
}

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE2
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

void solve() {
    int n; re(n);
    vt <int> v(n + 1);
    for(int i = 0;i <= n;i++)
        re(v[i]);

    vt <vt <ll>> dp(n + 1, vt <ll>(n + 1));
    vt <vt <int>> opt(n + 1, vt <int>(n + 1));

    for(int i = 0;i <= n;i++)
        opt[i][i] = i;

    for(int i = n - 1;i >= 1;i--) {
        for(int j = i + 1;j <= n;j++) {
            ll mn = LLONG_MAX;
            for(int k = opt[i][j - 1];k <= min(j - 1, opt[i + 1][j]);k++) {
                if(mn >= dp[i][k] + dp[k + 1][j] + 1LL * v[i - 1] * v[k] * v[j]) {
                    opt[i][j] = k;
                    mn = dp[i][k] + dp[k + 1][j] + 1LL * v[i - 1] * v[k] * v[j];
                }
            }
            dp[i][j] = mn;
        }
    }
    wr(dp[1][n]);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    Open("podm");

    int t = 1;
    for(;t;t--) {
        solve();
    }

    return 0;
}