Cod sursa(job #381117)

Utilizator Dr.OptixCristian Dinu Dr.Optix Data 9 ianuarie 2010 10:04:50
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
//Parantezare matrici, arhiva educationala infoarena

#include <stdio.h>

// Defines
#define SIZE 512
#define INF 9999999
// Global data
long long  N, D[SIZE], M[SIZE][SIZE];

// Prototypes
void ReadData();
void Compute();
void WriteData();
long Min(long A, long B);

/*void Debug()
{
    for(int i = 0; i<=N; ++i)
    {
        for(int j = 0; j<=N; ++j)
        {
            printf("%ld ", M[i][j]);
        }
        printf("\n");
    }
}
*/

// Impementation
int main()
{
    freopen("podm.in","r",stdin);
    freopen("podm.out","w", stdout);

    ReadData();
    Compute();
    //Debug();
    WriteData();

    return 0;
}

void ReadData()
{
    scanf("%lld", &N);

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

void Compute()
{
    for(int i = 1; i <= N; ++i)
        M[i][i] = 0;

    for(int i = 1; i <= N-1; ++i)
        M[i][i + 1] = D[i - 1] * D[i] * D[i + 1];

    for(int w = 2; w <= N; ++w)
        for(int i = 1; i <= N - w; ++i)
        {
            int j = i + w;
            M[i][j] = INF;
            for(int k = i; k <= j - 1; ++k)
                M[i][j] = Min(M[i][j], M[i][k] + M[k + 1][j] + D[i - 1] * D[k] * D[j]);
        }
}

void WriteData()
{
    printf("%lld\n", M[1][N]);
}

long Min(long A, long B)
{
    if(A < B)
        return A;
    return B;
}