Cod sursa(job #1605725)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 19 februarie 2016 13:50:40
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("podm.in");
ofstream fout("podm.out");

const int NMAX = (1<<9);
const long long INF = 0x7fffffffffffffff;

typedef long long in64;

int n;

in64 d[NMAX]; //M[i] = (d[i - 1], d[i])

in64 best[NMAX][NMAX];//best[i][j] = nr minim de inmutiri pentru realizarea inmultirii (Mi * Mi+1 * ... Mj)


int main() {

	fin >> n;

	for(int i = 0 ; i <= n; ++i)
		fin >> d[i];

	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
			best[i][j] = INF;

	for(int i = 1; i <= n; ++i)
		best[i][i] = 0, best[i][i + 1] = d[i - 1] * d[i] * d[i + 1];

	for(int dim = 2; dim <= n - 1; ++dim) {//calculam toate inmutilirile de fix d + 1 matrici 

		for(int i = 1; i <= n - dim ; ++i) { //incepand de la amtriciea i

			int last = i + dim;

			for(int inter = i ; inter <= last - 1; ++inter) { //la inmultirea finala 

				best[i][last] = min(best[i][last], best[i][inter] + best[inter + 1][last] + d[i - 1] * d[inter] * d[last]);
			}
		}
	}

	fout << best[1][n] << '\n'; 

	return 0;
}