Cod sursa(job #1430700)

Utilizator GilgodRobert B Gilgod Data 8 mai 2015 19:03:25
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define INF 0x3f3f3f3f3f3f3f3f
#define min(a,b) ((a)<(b))?(a):(b)
#define NMAX 510

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

using namespace std;

int N;
long long D[NMAX];

inline void readData() {
	freopen(IN, "r", stdin);
	scanf("%d", &N);
	for (int i = 0; i <= N; ++i)
		scanf("%ld", &D[i]);
	fclose(stdin);
}
long long best[NMAX + 1][NMAX + 1];

long long numar_minim_inmultiri(long long D[], int N) {
	//cazul de baza: matrice inmultita cu ea insasi

	memset(best, 0, sizeof(best));
	for (int i = 1; i <= N; ++i) {
		best[i][i] = 0;
	}
	for (int i = 1; i < N; ++i) {
		best[i][i + 1] = D[i - 1] * D[i] * D[i + 1];
	}

	for (int len = 3; len <= N; ++len) {
		for (int i = 1; i <= N + 1 - len; ++i) {
			int j = i + len - 1;
			best[i][j] = INF;
			//aflu minimul lantului A[i] * A[i+1] * .. A[i+len-1]
			//adica lantul de lungime len de inmultiri
			//incerc toate parantezarile 
			for (int k = i; k < j; ++k) {
				//paranteza pe pozitia k(incepand de la i+1 pana la j-1)
				long long q = best[i][k] + best[k + 1][j];
				q += D[i - 1] * D[k] * D[j];
				if (best[i][j] > q) {
					best[i][j] = q;
				}
			}
		}
	}
	return best[1][N];
}

int main(){
	readData();
	long long d = numar_minim_inmultiri(D, N);
	freopen(OUT, "w", stdout);
	printf("%lld\n", d);
	fclose(stdout);
	return 0;
}