Pagini recente » Cod sursa (job #1586542) | Cod sursa (job #2307707) | Cod sursa (job #604911) | Cod sursa (job #1736179) | Cod sursa (job #2205372)
#include <bits/stdc++.h>
using namespace std;
typedef long long int lint;
void add(pair <int, vector <int> > &where, const pair <int, int> &val) {
if (val.first < where.first)
where = {val.first, {val.second}};
else if (val.first == where.first)
where.second.push_back(val.second);
}
map <pair <int, int>, lint> Map;
lint DEI(const vector <int> &v, int i, int j) {
if (j - i < 3)
return 0;
if (Map.count({i, j}))
return Map[{i, j}];
Map[{i, j}] = -1;
pair <int, vector <int> > minimum(v[i + 1], {i + 1});
for (int k = i + 2; k < j - 1; ++ k)
add(minimum, {v[k], k});
//minimum.second.push_back(k);
lint ans = numeric_limits <lint> :: max();
for (const int k: minimum.second)
ans = min(ans, DEI(v, i, k + 1) + DEI(v, k, j) + 1LL * v[i] * v[k] * v[j - 1]);
Map[{i, j}] = ans;
return ans;
}
lint solve(const vector <int> &v) {
return DEI(v, 0, v.size());
}
int main() {
freopen("podm.in", "r", stdin);
freopen("podm.out", "w", stdout);
int N;
cin >> N;
vector <int> v(N + 1);
for (int i = 0; i <= N; ++ i)
cin >> v[i];
set <int> s(v.begin(), v.end());
assert(s.size() == v.size());
cout << solve(v) << endl;
return 0;
}