Pagini recente » Cod sursa (job #1551048) | Istoria paginii runda/simulare-cartita-02 | Cod sursa (job #2963964) | Cod sursa (job #1799530) | Cod sursa (job #707780)
Cod sursa(job #707780)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
/*
Se dă un produs matricial M = M1M2...Mn.
Se cere să se minimizeze numărul total de înmulţiri scalare al produsului matricial M, valoare ce corespunde unei parantezări optime.
*/
/* Relatia de recurenta:
* M(i, j) = { 0 , i = j
* { min{ M(i, k) + d[k-1]*d[k]*d[k+1] + M(k+1, j) } , i != j
* i<=k<j
* */
#define NMAX 502
#define DMAX 10001
int N;
long long d[NMAX];
long long M[NMAX][NMAX];
void solutie_podm()
{
int i, j;
int l, k;
long long s;
for(i = 1; i<N; i++) {
M[i][i] = 0;
M[i][i+1] = d[i-1]*d[i]*d[i+1];
}
M[N][N] = 0;
for ( l = 1 ; l< N ; l++) {
for( i = 1; i <=N-l; i++ ) {
j = i + l;
M[i][j] = LONG_MAX;
for(k = i; k< j; k++) {
s = M[i][k] + M[k+1][j] + d[i-1]*d[k]*d[j];
if(M[i][j] > s)
M[i][j] = s;
}
}
}
}
int main()
{
FILE *f, *fout;
int i;
f = fopen("podm.in", "r");
fscanf(f, "%d", &N);
for(i = 0 ; i <= N; i++ ) {
fscanf(f, "%lld", &d[i]);
}
fclose(f);
solutie_podm();
fout = fopen("podm.out", "w");
fprintf(fout, "%lld\n", M[1][N]);
fclose(fout);
return 0;
}