Cod sursa(job #432004)

Utilizator slayer4uVictor Popescu slayer4u Data 1 aprilie 2010 18:46:55
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
using namespace std;

#define inf 92233720368547758LL
#define NMAX 510

long long n, x[NMAX];
long long memo[NMAX][NMAX];

long long calculate(long left, long right)
{
	return (long long)(x[left] * x[left + 1] * x[right]);
}

void just_do_it(long left, long right)
{
	if (memo[left][right] != -1)
		return;

	if (right - left == 2)
	{
		memo[left][right] = (long long)(calculate(left, right));
		return;
	}
	
	long long minim = inf;
	for (long i = left + 1; i <= right - 1; ++i)
	{
		just_do_it(left, i);
		just_do_it(i, right);
		long long rez = (long long)(memo[left][i] + memo[i][right] + x[left] * x[i] * x[right]);
		minim = minim > rez ? rez : minim;
	}
	memo[left][right] = (long long)(minim == inf ? 0 : minim);
}

int main()
{
	freopen ("podm.in", "rt", stdin);
	freopen ("podm.out", "wt", stdout);

	scanf("%lld", &n);
	for (long i = 1; i <= n + 1; ++i)
		scanf("%lld", &x[i]);

	for (long i = 1; i <= n + 1; ++i)
		for (long j = 1; j <= n + 1; ++j)
			memo[i][j] = -1;

	just_do_it(1, n + 1);

	printf("%lld\n", memo[1][n + 1]);
	return 0;
}