Cod sursa(job #405666)

Utilizator TabaraTabara Mihai Tabara Data 28 februarie 2010 15:53:57
Problema Parantezare optima de matrici Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
/*
@ Mihai Tabara, 2010
Method: Recursion + memoisation
O(n^3) - time
O(N^2) - memory
90 - Works slower than PD - because it needs to compute every subproblem
*/

#include <fstream>
#include <climits>
#include <cstdio>
#include <cstdlib>
using namespace std;

const char* in = "podm.in";
const char* out = "podm.out";
const int NMAX = 505;
const long long INF = LLONG_MAX;

long long Mat ( int i, int j, long long*** ref, long long** P )
{
	long long Q;
	int k;
	if ( (*ref)[i][j] < INF )
		return (*ref)[i][j];
	if ( i == j )
		(*ref)[i][j] = 0;
	else
	{
		for ( k = i; k <= j-1; ++k )
		{
			Q = Mat ( i, k, ref, P ) + Mat ( k+1, j, ref, P ) + (*P)[i-1] * (*P)[k] * (*P)[j];
			if ( Q < (*ref)[i][j] )
				(*ref)[i][j] = Q;
		}
	}
	return (*ref)[i][j];
}

int main ( void )
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	int N;
	scanf ( "%d", &N );

	int i, j;
	long long ** M;
	long long * P;

	//M = (long long ** ) calloc ( NMAX, sizeof( long long * ) );
	M = new long long* [ NMAX ];
	for ( i = 0; i < NMAX; ++i )
		M[i] = new long long [ NMAX ];

	P = new long long [ NMAX ];
	//P = ( long long * ) calloc ( NMAX, sizeof( long long ) );

	for ( i = 0; i <= N; scanf ( "%lld", P+i++ ) );

	for ( i = 1; i <= N; ++i )
		for ( j = 1; j <= N; ++j )
			*(*(M+i)+j) = INF;

	printf ( "%lld\n", Mat( 1, N, &M, &P ) );

	delete [] P;
	for ( i = 0; i < NMAX; ++i )
		delete [] M[i];
	delete [] M;

	return 0;
}