Cod sursa(job #1740596)

Utilizator vladc096Vlad Cincean vladc096 Data 11 august 2016 20:47:34
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <cstdlib>
#include <climits>

int main() {
	int n;
	int *d;
	long long **m;
	int i, j, k, len, q;

	freopen("podm.in", "r", stdin);
	freopen("podm.out", "w", stdout);

	// input
	scanf("%d", &n);
	d = (int*)malloc((n + 1) * sizeof(int));
	for (i = 0; i <= n; ++i) {
		scanf("%d", &d[i]);
	}

	// solve
	m = (long long**)malloc((n + 1) * sizeof(long long*));
	for (i = 1; i <= n; i++) {
		m[i] = (long long*)malloc((n + 1) * sizeof(long long));
	}

	for (i = 1; i <= n; ++i) {
		m[i][i] = 0;
	}

	for (i = 1; i <= n - 1; ++i) {
		m[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
	}

	for (len = 2; len <= n; ++len) {
		for (i = 1; i <= n - len /*+ 1*/; ++i) {
			j = i + len /*- 1*/;
			m[i][j] = LLONG_MAX;
			for (k = 1; k <= j - 1; ++k) {
				q = m[i][k] + m[k + 1][j] + d[i - 1] * d[k] * d[j];
				if (q < m[i][j]) {
					m[i][j] = q;
				}
			}
		}
	}

	// output
	printf("%lld\n", m[1][n]);

	// free memory
	free(d);
	for (i = 1; i <= n; ++i) {
		free(m[i]);
	}
	free(m);

	return 0;
}