Cod sursa(job #1344441)

Utilizator SmarandaMaria Pandele Smaranda Data 16 februarie 2015 18:52:29
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 505;
const long long inf = (1ll << 62) - 1;

struct Dim {
    int a, b;
};

Dim M [N], rez [N][N];
long long dp [N][N];

long long mult (int x1, int y1, int x2, int y2) {
    long long ans;

    ans = 1ll * rez [x1][y1].a * rez [x1][y1].b * rez [x2][y2].b;
    return ans;
}

int main () {
    int n, i, x, y, k, h, j;

    freopen ("podm.in", "r", stdin);
    freopen ("podm.out", "w", stdout);

    scanf ("%d%d", &n, &x);
    for (i = 2; i <= n + 1; i ++) {
        M [i - 1].a = x;
        scanf ("%d", &x);
        M [i - 1].b = x;
    }
    for (i = 1; i <= n; i ++) {
        for (j = 1; j <= n; j ++)
            dp [i][j] = inf;
        dp [i][i]= 0;
        rez [i][i] = M [i];
        rez [i + 1][i + 1] = M [i + 1];
        dp [i][i + 1] = mult (i, i, i + 1, i + 1);
        rez [i][i + 1].a = M [i].a;
        rez [i][i + 1].b = M [i + 1].b;
    }
    for (k = 3; k <= n; k ++)
        for (i = 1; i + k - 1 <= n; i ++) {
            j = i + k - 1;
            for (h = i + 1; h <= j; h ++)
                dp [i][j] = min (dp [i][j], 1ll * dp [i][h - 1] + dp [h][j] + mult (i, h - 1, h, j));
            rez [i][j].a = M [i].a;
            rez [i][j].b = M [j].b;
        }
    printf ("%lld\n", dp [1][n]);
    return 0;
}