Cod sursa(job #631343)

Utilizator floringh06Florin Ghesu floringh06 Data 7 noiembrie 2011 20:39:11
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cfloat>
#include <numeric>

using namespace std;

const int    oo  = 0x3f3f3f3f;
const double eps = 1e-9;

typedef long long ll;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;

#define sz(c) int ((c).size())
#define all(c) (c).begin(), (c).end()
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORD(i, a, b) for (int i = (b) - 1; i >= (a); --i)
#define FORIT(i, c) for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define mp make_pair
#define pb push_back
#define MAX_N 505

ll dim[MAX_N];
ll dp[MAX_N][MAX_N];

int N;

int main () {
    freopen ("podm.in", "r", stdin);
    freopen ("podm.out", "w", stdout);
    
    scanf ("%d", &N);
    FOR (i, 0, N + 1) scanf ("%lld", dim + i);
    
    FOR (i, 1, N) dp[i][i + 1] = dim[i - 1] * dim[i] * dim[i + 1];
    
    FORD (i, 1, N + 1) FOR (j, i + 2, N + 1) {
        dp[i][j] = LLONG_MAX / 2;
        
        FOR (k, i, j) 
            dp[i][j] = min (dp[i][j], dp[i][k] + dp[k + 1][j] +
                                      dim[i - 1] * dim[k] * dim[j]);
    }
    
    printf ("%lld\n", dp[1][N]);
    
    return 0;
}