Cod sursa(job #1095729)

Utilizator gabrielvGabriel Vanca gabrielv Data 31 ianuarie 2014 19:59:30
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

using namespace std;

#define minim(a,b) ((a<b)?(a):(b))

#define NMAX 505
#define oo (1LL<<60)

int N;
long long Dim[NMAX];
long long DP[NMAX][NMAX];

void Read()
{
    freopen("podm.in","r",stdin);
    scanf("%d",&N);

    for(int i=0;i<=N;i++)
        scanf("%lld",&Dim[i]);
}

void Solve()
{
    //DP[i][j] = numarul minim de calcule ce sunt necesare pentru a inmulti matricile de la i la j

    for(int i=1;i<=N;i++)
        DP[i][i+1] = Dim[i-1] * Dim[i] * Dim[i+1];

    for(int dif=2; dif < N; dif++)
        for(int i=1; i+dif <=N; i++)
        {
            int j = i+dif;
            DP[i][j] = oo;

            for(int k=i;k<j;k++)
                DP[i][j] = minim(DP[i][j], DP[i][k] + DP[k+1][j] + Dim[i-1] * Dim[k] * Dim[j]);
        }

}

void Print()
{
    freopen("podm.out","w",stdout);
    printf("%lld\n",DP[1][N]);
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}