Pagini recente » Cod sursa (job #337526) | Cod sursa (job #3250946) | Cod sursa (job #2694480) | Cod sursa (job #2238724) | Cod sursa (job #1094468)
#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;
*/