Pagini recente » Cod sursa (job #1785330) | Cod sursa (job #2693079) | Cod sursa (job #2632313) | Cod sursa (job #2297498) | Cod sursa (job #2500643)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("podm.in");
ofstream out("podm.out");
const int INF = 0x3f3f3f3f;
int main() {
int n;
in >> n;
vector <int> d(n + 1);
for (int i = 0; i < n + 1; i++) {
in >> d[i];
}
// dp[i][j] - solutia optima pentru partea M[i] ... M[j]
vector <vector <int64_t> > dp(n + 1, vector <int64_t> (n + 1, 0));
for (int i = 1; i < n; i++) {
dp[i][i + 1] = 1ll * d[i - 1] * d[i] * d[i + 1];
}
int64_t nr, min;
for (int step = 2; step < n; step++) {
for (int i = 1; i + step <= n; i++) {
min = INF;
for (int k = i; k < i + step; k++) {
nr = dp[i][k] + 1ll* d[i - 1] * d[k] * d[i + step] + dp[k + 1][i + step];
if (min > nr)
min = nr;
}
dp[i][i + step] = min;
}
}
out << dp[1][n] << '\n';
return 0;
}