Cod sursa(job #952614)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 18:57:16
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define In "podm.in"
#define Out "podm.out"
#define Nmax 502
#define Inf 9223372036854775807LL
#define min(a,b) (((a)<=(b))?(a):(b))
using namespace std;
int n;
long long best[Nmax][Nmax],D[Nmax];
//best[i][j] = solutia optima din intervalul i,i+1,...,j;
//matricea i are dimensiunile (Di-1],D[i])
//numarul de inmultiri efectuate pentru a inmulti doua matrice cu
//dimensiunile (x,y) respectiv (y,z) este  x*y*z
inline void Citire()
{
    ifstream f(In);
    f>>n;
    int i;
    for(i=0;i<=n;i++)
        f>>D[i];
}
inline void Dinamic()
{
    int k,i,j,d;
    for(i=1;i<=n;i++)
        best[i][i]=0;
    for(i=1;i<n;i++)
        best[i][i+1] = D[i-1] * D[i] * D[i+1];
    for(d=2;d<=n;d++)
        for(i = 1, j = d;j<=n;i++,j++)
        {
            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]+D[i-1]*D[k]*D[j]);
        }
}
inline void Afisare()
{
    ofstream g(Out);
    g<<best[1][n]<<"\n";
    g.close();
}
int main()
{
    Citire();
    Dinamic();
    Afisare();
    return 0;
}