Cod sursa(job #1451281)

Utilizator GilgodRobert B Gilgod Data 16 iunie 2015 18:16:42
Problema Parantezare optima de matrici Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <cstring>

#define INF 0x3f3f3f3f

const int NMAX = 501;
const char IN[] = "podm.in", OUT[] = "podm.out";

using namespace std;

long long M[NMAX][NMAX], S[NMAX][NMAX];
long long N;
long long P[NMAX];

inline void read_data() {
	freopen(IN, "r", stdin);
	scanf("%d", &N);
	for (long long i = 0; i <= N; ++i) {
		scanf("%d", &P[i]);
	}
	fclose(stdin);
}

inline long long parantezare_optima() {
	//initializari pesimiste
	memset(M, INF, sizeof(M));
	//caz de baza A[i,i] = 0
	for (long long i = 0; i <= N; ++i) M[i][i] = S[i][i] = 0;
	//lanturi de 2..n-1
	for (long long l = 2; l <= N; ++l) {
		for (long long i = 1; i <= N - l + 1; ++i) {
			long long j = i + l - 1;
			for (long long k = i; k < j; ++k) {
				long long q = M[i][k] + M[k + 1][j] + P[i - 1] * P[k] * P[j];
				if (M[i][j] > q) {
					M[i][j] = q;
					S[i][j] = k;
				}
			}
		}
	}
	printf("Parantezare optima: %d\n", M[1][N]);
	return M[1][N];
}

int main() {
	read_data();
	fprintf(fopen(OUT, "w"), "%d\n", parantezare_optima());
	return 0;
}