Cod sursa(job #707783)

Utilizator asaidaAnca Vamanu asaida Data 5 martie 2012 23:26:54
Problema Parantezare optima de matrici Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.15 kb
#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;
}