Pagini recente » Cod sursa (job #2135806) | Cod sursa (job #2853375) | Cod sursa (job #3242022) | Cod sursa (job #1583032) | Cod sursa (job #1430700)
#include <iostream>
#include <fstream>
#include <cstring>
#define INF 0x3f3f3f3f3f3f3f3f
#define min(a,b) ((a)<(b))?(a):(b)
#define NMAX 510
const char IN[] = "podm.in", OUT[] = "podm.out";
using namespace std;
int N;
long long D[NMAX];
inline void readData() {
freopen(IN, "r", stdin);
scanf("%d", &N);
for (int i = 0; i <= N; ++i)
scanf("%ld", &D[i]);
fclose(stdin);
}
long long best[NMAX + 1][NMAX + 1];
long long numar_minim_inmultiri(long long D[], int N) {
//cazul de baza: matrice inmultita cu ea insasi
memset(best, 0, sizeof(best));
for (int i = 1; i <= N; ++i) {
best[i][i] = 0;
}
for (int i = 1; i < N; ++i) {
best[i][i + 1] = D[i - 1] * D[i] * D[i + 1];
}
for (int len = 3; len <= N; ++len) {
for (int i = 1; i <= N + 1 - len; ++i) {
int j = i + len - 1;
best[i][j] = INF;
//aflu minimul lantului A[i] * A[i+1] * .. A[i+len-1]
//adica lantul de lungime len de inmultiri
//incerc toate parantezarile
for (int k = i; k < j; ++k) {
//paranteza pe pozitia k(incepand de la i+1 pana la j-1)
long long q = best[i][k] + best[k + 1][j];
q += D[i - 1] * D[k] * D[j];
if (best[i][j] > q) {
best[i][j] = q;
}
}
}
}
return best[1][N];
}
int main(){
readData();
long long d = numar_minim_inmultiri(D, N);
freopen(OUT, "w", stdout);
printf("%lld\n", d);
fclose(stdout);
return 0;
}