Cod sursa(job #2381230)

Utilizator PirvuMihaiPirvu Mihai PirvuMihai Data 16 martie 2019 12:23:20
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <cassert>
#include <algorithm>
#include <vector>
#include <limits>
#include <cstdint>

int main() {
	std::ifstream f("podm.in");
	assert (!f.fail());
	std::ofstream g("podm.out");
	std::uint64_t inf = std::numeric_limits<std::uint64_t>::max();

	int n;
	f >> n;
	std::vector<int> v(n + 1);
	for(int i=0; i<n + 1; i++) {
		f >> v[i];
	}
	// std::for_each(v.begin(), v.end(), [](int &x) { std::cout << x << " ";});
	// std::cout << "\n";

	std::uint64_t dp[n + 1][n + 1];
	/* initialize & set dp[i][i] = 0 */
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++) {
			dp[i][j] = inf;
		}
		dp[i][i] = 0;
	}

	/* Set dp[i][i + 1] = d(i-1) * d(i) * d(i+1) */
	for(int i = 1; i <= n-1; i++) {
		dp[i][i + 1] = 1ull * v[i - 1] * v[i] * v[i + 1];
	}

	// for(int i = 1; i <= n; i++) {
	// 	for(int j = 1; j <= n; j++) {
	// 		std::cout << (dp[i][j] == inf ? "x" : std::to_string(dp[i][j])) << " ";
	// 	}
	// 	std::cout <<"\n";
	// }

	for(int len = 2; len <= n; len++) {
		for(int i = 1; i + len - 1 <= n; i++) {
			int j = i + len - 1;
			for(int k = i; k < j; k++) {
				std::uint64_t new_sol = dp[i][k] + dp[k + 1][j] + 1ull * v[i - 1] * v[k] * v[j];
				// std::printf("Computing len %u, pos (%d->%d->%d). Old val: %llu. New val: %llu\n", 
					// len, i, k, j, dp[i][j], new_sol);
				dp[i][j] = std::min(dp[i][j], new_sol);
			}
		}
	}

	// for(int i = 1; i <= n; i++) {
	// 	for(int j = 1; j <= n; j++) {
	// 		std::cout << (dp[i][j] == inf ? "x" : std::to_string(dp[i][j])) << " ";
	// 	}
	// 	std::cout <<"\n";
	// }

	// std::cout << "Solution:" << dp[1][n] << "\n";
	g << dp[1][n];

	return 0;
}