Cod sursa(job #3039110)

Utilizator vladth11Vlad Haivas vladth11 Data 28 martie 2023 10:36:23
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")

using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;

const ll NMAX = 501;
const ll INF = 1e9;
const ll nrbits = 17;
const ll MOD = 998244353;

pii v[NMAX];
ll d[NMAX + 1];
ll dp[NMAX][NMAX];
pii r[NMAX][NMAX];

void minSelf(ll &x, ll val){
    x = min(x, val);
}

int main() {
//#ifdef HOME
    ifstream cin("podm.in");
    ofstream cout("podm.out");
//#endif // HOME
    ll n, i;
    cin >> n;
    for(i = 1; i <= n + 1; i++){
        cin >> d[i];
        if(i > 1){
            v[i - 1] = {d[i - 1], d[i]};
            r[i - 1][i - 1] = v[i - 1];
        }
    }
    for(i = 1; i <= n - 1; i++){
        dp[i][i + 1] = v[i].first * v[i].second * v[i + 1].second;
        r[i][i + 1] = {v[i].first, v[i + 1].second};
    }
    for(ll l = 3; l <= n; l++){
        for(ll i = 1; i + l - 1 <= n; i++){
            ll j = i + l - 1;
            dp[i][j] = dp[i][i + 1] + dp[i + 2][j] + r[i][i + 1].first * r[i][i + 1].second * r[i + 2][j].second;
            r[i][j] = {r[i][i + 1].first, r[i + 2][j].second};
            for(ll k = i; k < j; k++){
                minSelf(dp[i][j], dp[i][k] + dp[k + 1][j] + r[i][k].first * r[i][k].second * r[k + 1][j].second);
            }
        }
    }
    cout << dp[1][n];
}