Cod sursa(job #396037)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 14 februarie 2010 13:38:44
Problema Parantezare optima de matrici Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>
#define INFINIT 1000000000000ll
#define minim(a, b) (a < b ? a : b)
#define N 500

long long dim[N + 2];
long long m[N + 1][N + 1];
int n;

void citeste()
{
	FILE* fi = fopen("podm.in", "r");
	fscanf(fi, "%d", &n);
	int i;
	for(i = 1; i <= n + 1; ++i) fscanf(fi, "%lld", &dim[i]);
	fclose(fi);
}

void scrie()
{
	FILE* fo = fopen("podm.out", "w");
	fprintf(fo, "%lld\n", m[1][n]);
	fclose(fo);
}

inline void init()
{
	int i, j;
	for(i = 1; i <= n; ++i) for(j = 1; j <= n; ++j) m[i][j] = -1;
}

void calculeaza()
{
	int i, j, k, rand;
	long long valmin, candidat;
	for(i = 1; i <= n; ++i) m[i][i] = 0;
	for(rand = 2; rand <= n; ++rand)
	{
		i = 0, j = rand - 1;
		while(j < n)
		{
			++i;
			++j;
			valmin = INFINIT;
			for(k = i; k <= j - 1; ++k)
			{
				candidat = m[i][k] + m[k + 1][j] + dim[i] * dim[k + 1] * dim[j + 1];
				valmin = minim(valmin, candidat);
			}
			m[i][j] = valmin;
		}
	}
}

long long podm(int i, int j)
{
	if(m[i][j] != -1) return m[i][j]; //valoarea a fost calculata

	//in cazul in care valoarea nu a fost calculata

	if(i == j) return m[i][j] = 0; //o matrice nu se va inmulti cu ea insasi
	
	// i != j

	long long valmin = -1, candidat;
	int k;

	for(k = i; k <= j - 1; ++k)
	{
		
		candidat = podm(i, k) + podm(k + 1, j) + (long long)dim[i] * (long long)dim[k + 1] * (long long)dim[j + 1];
		if(candidat < valmin || valmin == -1) valmin = candidat;
	}
	m[i][j] = (valmin == -1 ? 0 : valmin);
	return valmin;
}

int main()
{
	citeste();
	init();
	//podm(1, n);
	calculeaza();
	scrie();
	return 0;
}