Cod sursa(job #1750397)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 30 august 2016 04:32:24
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

int main() {
	freopen("podm.in", "r", stdin);
	freopen("podm.out", "w", stdout);
	int N;
	long long a;
	scanf("%d", &N);
	vector<long long> dims, aux(505);
	vector<vector<long long> > D(505, aux);                                              //D(i, j) = numarul min de inmultiri intre matricile
                                                                                   // i si j
	if (N + 1 == 2)
		return 0;

	for (int i = 0; i <= N; i ++) {
		scanf("%lli", &a);
		dims.push_back(a);
	}

	for (int i = 1; i <= N; i ++)                                                    //umple diagonala
		D[i][i] = 0;
	for (int i = 1; i <= N - 1; i ++)
		D[i][i + 1] = dims[i] * dims[i + 1] * dims[i - 1];                           //umple linia de deasupra diagonalei
	for (int w = 2; w <= N - 1; w ++) 
		for (int i = 1; i <= N - w; i ++) {                                          //umple matricea deasupra a ce am umplut pana acum
			int j = i + w;
			long long min = 100000000000000000LL;
			for (int k = i; k < j; k ++)                                              //=> matrice superior triunghiulara, ca inferior
				if (D[i][k] + D[k + 1][j] + dims[k] * dims[i - 1] * dims[j] < min)    // ar fi (2, 1)..., care nu sunt intervale valide
					min = D[i][k] + D[k + 1][j] + dims[k] * dims[i - 1] * dims[j];
			D[i][j] = min;
		}
	
	printf("%lli\n", D[1][N]);
	return 0;
}