Cod sursa(job #431952)

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

#define inf 2000000000000000LL
#define NMAX 510

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 (right - left == 2)
	{
		if (memo[left][right] == -1)
			memo[left][right] = 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 = memo[left][i] + memo[i][right] + x[left] * x[i] * x[right];
		minim = minim > rez ? rez : minim;
	}
	memo[left][right] = minim == inf ? 0 : minim;
}

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

	scanf("%ld", &n);
	for (long i = 1; i <= n + 1; ++i)
		scanf("%ld", &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;
}