Cod sursa(job #3195133)

Utilizator radu1331Mocan Radu radu1331 Data 20 ianuarie 2024 10:14:34
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
#define fastIO ios_base::sync_with_stdio(NULL);cin.tie(NULL);
#define testCases int tc;cin>>tc;while(tc--);
#define ll long long
#define ld long double
#define sza(x) ((int)x.size())
#define all(a) (a).begin(),(a).end()
#define PI 3.1415926535897932384626433832795l
template<typename T> inline T gcd(T a,T b){return (b?__gcd(a,b):a);}
template<typename T> inline T lcm(T a,T b){return (a*(b/gcd(a,b)));}
const int NMAX = 1e3 + 5;
ll mat[NMAX], dp[NMAX][NMAX];
static inline void solve();

int main(int argc, char** argv)
{

    (void)! freopen ("podm.in", "r", stdin);
    (void)! freopen ("podm.out", "w", stdout);
    fastIO
    
    // testCases
    solve();

    return 0;
}

static inline void solve()
{
    ll n; cin >> n;
    for (ll i = 0; i <= n; ++i)
        cin >> mat[i];
    for (ll step = 1; step < n; ++step)
    {
        for (ll i = 1; i <= n - step; ++i)
        {
            ll j = i + step;
            ll best = LONG_MAX;
            for (ll k = i; k < j; ++k)
            {
                ll res = dp[i][k] + dp[k + 1][j] + mat[i - 1] * mat[j] * mat [k];
                best = min(best, res);
            }
            dp[i][j] = best;
        }
    }
    cout << dp[1][n];
}