Cod sursa(job #1234829)

Utilizator andreioneaAndrei Onea andreionea Data 28 septembrie 2014 09:14:39
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#include <vector>
#include <algorithm>

int main()
{
	std::vector<unsigned long long> dim;
	int n;
	std::ifstream f("podm.in");
	std::ofstream g("podm.out");

	f >> n;
	dim.reserve(n + 1);

	for (int i = 0; i <= n; ++i){
		unsigned long long x;
	 	f >> x;
	 	dim.push_back(x);
	}

	std::vector<std::vector<unsigned long long> > best;
	best.reserve(n);
	
	for (int i = 0; i < n; ++i) {
		best.push_back(std::vector<unsigned long long>());
		best[i].reserve(n);
		for (int j = 0; j < n; ++j){
			if(j == i + 1) 
				best[i].push_back(dim[i] * dim[j] * dim[j + 1]);
			else if (i == j)
				best[i].push_back(0);
			else
				best[i].push_back((unsigned long long)-1);
		}
	}

	for (int d = 2; d < n; ++d) {
		for (int i = 0; i < n - d; ++i) {
			for (int k = i; k < i + d; ++k) {
				best[i][i + d] = std::min(best[i][i + d], best[i][k] + best[k + 1][i + d] + dim[i] * dim[k + 1] * dim[i + d + 1]);
			}
		}
	}
	g << best[0][n-1] << "\n";
	f.close();
	g.close();
	return 0;
}