Pagini recente » Cod sursa (job #1064182) | Cod sursa (job #2333961) | Cod sursa (job #2226606) | Cod sursa (job #2912542) | Cod sursa (job #1451281)
#include <iostream>
#include <cstring>
#define INF 0x3f3f3f3f
const int NMAX = 501;
const char IN[] = "podm.in", OUT[] = "podm.out";
using namespace std;
long long M[NMAX][NMAX], S[NMAX][NMAX];
long long N;
long long P[NMAX];
inline void read_data() {
freopen(IN, "r", stdin);
scanf("%d", &N);
for (long long i = 0; i <= N; ++i) {
scanf("%d", &P[i]);
}
fclose(stdin);
}
inline long long parantezare_optima() {
//initializari pesimiste
memset(M, INF, sizeof(M));
//caz de baza A[i,i] = 0
for (long long i = 0; i <= N; ++i) M[i][i] = S[i][i] = 0;
//lanturi de 2..n-1
for (long long l = 2; l <= N; ++l) {
for (long long i = 1; i <= N - l + 1; ++i) {
long long j = i + l - 1;
for (long long k = i; k < j; ++k) {
long long q = M[i][k] + M[k + 1][j] + P[i - 1] * P[k] * P[j];
if (M[i][j] > q) {
M[i][j] = q;
S[i][j] = k;
}
}
}
}
printf("Parantezare optima: %d\n", M[1][N]);
return M[1][N];
}
int main() {
read_data();
fprintf(fopen(OUT, "w"), "%d\n", parantezare_optima());
return 0;
}