Cod sursa(job #2791159)

Utilizator crismariuCrismariu Codrin crismariu Data 30 octombrie 2021 10:19:30
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC optimize("O3")
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define FASTIO cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
#define FILES freopen("podm.in", "r", stdin); freopen("podm.out", "w", stdout);

using namespace std;
using namespace __gnu_pbds;

template<typename T>
using ordered_set = tree<T, null_type,less<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define int ll

int m[505][505], v[505];

signed main() {
    #ifndef ONLINE_JUDGE
        FASTIO; FILES;
    #endif // ONLINE_JUDGE

    int n; cin >> n;
    for(int i = 0; i <= n; i++)
        cin >> v[i];

    for(int i = 1; i <= n; i++)  {
        if(i != n)
            m[i][i + 1] = v[i - 1] * v[i] * v[i + 1];
        m[i][i] = 0;
    }
    for(int w = 2; w <= n - 1; w++)
        for(int i = 1; i <= n - w; i++) {
            int j = i + w;
            m[i][j] = LLONG_MAX;
            for(int k = i; k <= j - 1; k++)
                m[i][j] = min(m[i][j], m[i][k] + m[k + 1][j] + v[i - 1] * v[k] * v[j]);
    }
    cout << m[1][n];
    return 0;
}