Pagini recente » Rezultatele filtrării | Cod sursa (job #988063) | Cod sursa (job #1943606) | Cod sursa (job #2503321) | Cod sursa (job #435827)
Cod sursa(job #435827)
#include <cstdio>
int N;
unsigned long long col[512], lin[512], opt[512][512];
void read() {
freopen("podm.in", "r", stdin);
// citesc numarul de matrice
scanf("%d", &N);
// citesc dimensiunile matricelor
for (int i = 0; i <= N; ++i) {
scanf("%d", &col[i]);
if (i >= 1) {
lin[i] = col[i - 1];
}
}
}
void solve() {
// calculez optimul pentru inmultirile de k matrice
for (int k = 2; k <= N; ++k) {
int Nk = N - k + 1;
for (int i = 1; i <= Nk; ++i) {
// incerc o matrice, i cu restul de k - 1 matrice
opt[k][i] = opt[k - 1][i + 1] + lin[i] * col[i] * col[i + k - 1];
// incerc matrice mai multe
for (int l = 2; l < k; ++l) {
if (opt[l][i] + opt[k - l][i + l] + lin[i] * col[i + l - 1] * col[i + k - 1] < opt[k][i]) {
opt[k][i] = opt[l][i] + opt[k - l][i + l] + lin[i] * col[i + l - 1] * col[i + k - 1];
}
}
}
}
}
void write() {
freopen("podm.out", "w", stdout);
// scriu rezultatul inmultirii
printf("%llu\n", opt[N][1]);
}
int main() {
read();
solve();
write();
return 0;
}