Cod sursa(job #1094468)

Utilizator malina_floreaMalina Florea malina_florea Data 29 ianuarie 2014 14:18:39
Problema Parantezare optima de matrici Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#define INFINIT 1000000000
#define NMAX 504
using namespace std;
ifstream fin ("podm.in");
ofstream fout ("podm.out");

long long int n;
long long int d[NMAX];
long long int nrmin[NMAX][NMAX];

void citire();
void pd();

int main()
{
    citire();
    pd();

    fout<< nrmin[1][n]<< "\n";

    fin.close();
    fout.close();
    return 0;
}

void citire()
{
    int i;
    fin>> n;
    for (i=0; i<=n; i++) fin>> d[i];
}

void pd()
{
    int i, j, k;
    int x, kmin, minim;
    // doua matrici
    for (i=1; i<n; i++) nrmin[i][i+1] = d[i-1] * d[i] * d[i+1];

    //calculez pentru 4

    for (x=3; x<=n; x++)
         for (i=1; i<=n-x+1; i++)
              // am x matrici incepand de la poz. i
              {j=i+x-1;
               minim=INFINIT;

               for (k=i; k<j; k++)
                    if (minim > nrmin[i][k] + nrmin[k+1][j] + (d[i-1] * d[k] * d[j]))
                       {minim = nrmin[i][k] + nrmin[k+1][j] + (d[i-1] * d[k] * d[j]);
                        kmin=k;
                       }

               nrmin[i][j]=minim;
               nrmin[j][i]=kmin;
              }
}






/*
sa se det. numarul min, de inmultiri necesare pentru a calcula prod. ai * ai+1 * .. * aj
1<=i<=j<=n

solutiile subproblemelor le punem intr-o matrice, DOAR deasupra diagonalei principale
(jumatate din matrice ramane goala)

recurenta:

nrmin[i][i]=0; 1<=i<=n;
nrmin[i][i+1]=d[i-1]*d[i]*d[i+1]; 1<=i<=n-1;
nrmin[i][j]=min {nrmin[i][k] + nrmin[k+1][j] + d[i-1]*d[k]*d[j]}
            i<=k<=j-1
nrmin[j][i]=kmin;
*/