Cod sursa(job #435827)

Utilizator vlad.maneaVlad Manea vlad.manea Data 7 aprilie 2010 21:40:31
Problema Parantezare optima de matrici Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>

int N;
unsigned long long col[512], lin[512], opt[512][512];

void read() {

	freopen("podm.in", "r", stdin);

	// citesc numarul de matrice
	scanf("%d", &N);

	// citesc dimensiunile matricelor
	for (int i = 0; i <= N; ++i) {
		scanf("%d", &col[i]);
		if (i >= 1) {
			lin[i] = col[i - 1];
		}
	}
}

void solve() {

	// calculez optimul pentru inmultirile de k matrice
	for (int k = 2; k <= N; ++k) {
		int Nk = N - k + 1;
		for (int i = 1; i <= Nk; ++i) {
			
			// incerc o matrice, i cu restul de k - 1 matrice
			opt[k][i] = opt[k - 1][i + 1] + lin[i] * col[i] * col[i + k - 1];

			// incerc matrice mai multe
			for (int l = 2; l < k; ++l) {
				if (opt[l][i] + opt[k - l][i + l] + lin[i] * col[i + l - 1] * col[i + k - 1] < opt[k][i]) {
					opt[k][i] = opt[l][i] + opt[k - l][i + l] + lin[i] * col[i + l - 1] * col[i + k - 1];
				}
			}
		}
	}
}

void write() {

	freopen("podm.out", "w", stdout);

	// scriu rezultatul inmultirii
	printf("%llu\n", opt[N][1]);
}

int main() {

	read();
	solve();
	write();

	return 0;
}