Cod sursa(job #917753)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 18 martie 2013 12:15:18
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#define INF 200000000000000LL

using namespace std;

int n;
long long d[505];
long long best[505][505];

/**
    d[i-1][i] = dimensiunile matricei i
    best[i][j] = numarul minim de inmultiri necesare pentru a inmulti matricele de la i la j
    solutie best[1][n];
    best[i][j] = min (best[i][j], best[i][k] + best[k+1][j] + d[i-1]*d[k]*d[j]);
*/

inline long long Min (long long a, long long b)
{
    if (a<b)
        return a;
    return b;
}

int main()
{
    ifstream f ("podm.in");
    f>>n;
    int i, j, k, dg;
    for (i=0; i<=n; i++)
        f>>d[i];
    f.close();

    for (i=1; i<n; i++)
        best[i][i+1] = d[i-1]*d[i]*d[i+1];

    for (dg=2; dg<=n; dg++)
    {
        for (i = 1, j=dg; j<=n && i<=n; j++, i++)
        {
            if(best[i][j] == 0)
                best[i][j] = INF;
            for (k=i; k<j; k++)
                best[i][j] = Min (best[i][j], best[i][k] + best[k+1][j] + 1LL*d[i-1]*d[k]*d[j]);
        }
    }

    ofstream g("podm.out");
    g<<best[1][n]<<"\n";
    g.close();
    return 0;
}