Cod sursa(job #396022)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 14 februarie 2010 13:22:35
Problema Parantezare optima de matrici Scor 90
Compilator c Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

#define N 500

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

void citeste()
{
	FILE* fi = fopen("podm.in", "r");
	fscanf(fi, "%d", &n);
	int i;
	for(i = 1; i <= n + 1; ++i) fscanf(fi, "%d", &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;
}

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)
	{
		//fprintf(stderr, "pana la urma *** ");
		
		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);
#ifdef DEBUGME
	fprintf(stderr, "podm(%d, %d): %d\n", i, j, m[i][j]);
#endif
	return valmin;
}

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