Pagini recente » Cod sursa (job #1187724) | Cod sursa (job #2127798) | Cod sursa (job #2625804) | Cod sursa (job #2785053) | Cod sursa (job #2381229)
#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;
}