Cod sursa(job #435862)
#include <cstdio>
#define Inf 9223372036854775807LL
int N;
long long col[512], lin[512], opt[512][512];
void read() {
int i;
freopen("podm.in", "r", stdin);
// citesc numarul de matrice
scanf("%d", &N);
// citesc dimensiunile matricelor
for (i = 0; i <= N; ++i) {
scanf("%lld", &col[i]);
if (i >= 1) {
lin[i] = col[i - 1];
}
}
}
inline long long minim(long long a, long long b) {
return a < b? a: b;
}
void solve() {
int k, l, i, j, m;
long long cant;
for (k = 2; k <= N; ++k) {
m = N - k + 1;
for (i = 1; i <= m; ++i) {
j = i + k - 1;
// infinit
opt[i][j] = Inf;
// incerc matrice mai multe
for (l = i; l < j; ++l) {
opt[i][j] = minim(opt[i][j], opt[i][l] + opt[l + 1][j] + lin[i] * col[l] * col[j]);
}
}
}
}
void write() {
freopen("podm.out", "w", stdout);
// scriu rezultatul inmultirii
printf("%lld\n", opt[1][N]);
}
int main() {
read();
solve();
write();
return 0;
}