Pagini recente » Cod sursa (job #2133856) | Monitorul de evaluare | Istoria paginii utilizator/negreanuvlad | Cod sursa (job #2189984) | Cod sursa (job #2023385)
// Example program
#include <iostream>
#include <fstream>
#include <string>
#include <map>
int constexpr MAXN = 501;
int constexpr MAX_INT = 0x3f3f3f3f;
struct Pair
{
Pair() : x(), y() {}
Pair(int x, int y) : x(x), y(y) {}
int x, y;
};
bool operator<(const Pair & lhs, const Pair & rhs) // lhs = left-hand side
// rhs = right-hand side
{
if (lhs.x != rhs.x)
{
return lhs.x < rhs.x;
}
else
{
return lhs.y < rhs.y;
}
}
std::map <Pair, int> dp;
int d[MAXN];
int pd(int i, int j) {
if (i == j) {
return 0;
}
if(j == i + 1) {
return d[i] * d[i + 1] * d[i + 2];
}
if (dp.find({i, j}) != dp.end()) {
return dp[{i, j}];
}
int min = MAX_INT;
for (int k = i; k < j; ++k) {
int curr_sum = pd(i, k) + pd(k + 1, j) + d[i] * d[k + 1] * d[j + 1];
if (curr_sum < min) min = curr_sum;
}
dp[{i, j}] = min;
return dp[{i, j}];
}
int main()
{
int n, i;
std::ifstream in("podm.in");
std::ofstream out("podm.out");
in >> n;
for (i = 0; i <= n; ++i) {
in >> d[i];
}
out << pd(0, n - 1) << "\n";
return 0;
}