#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define FOR(i, a, b) for (i = (a); i <= (b); ++ i)
#define INF 100000000
/*
void afisare(int i, int j)
{
if (i==j)
printf("M%i",i);
else
{
printf("(");
afisare(i, M[i][j]);
printf(")*(");
afisare(M[i][j]+1, j);
printf(")");
}
}
*/
int main(){
FILE* f;
FILE* g;
int n, i, j, h, k, min, kmin, w;
int** M;
int* d;
min = 0;
kmin = 0;
j=0;
f= fopen("podm.in","r");
fscanf(f, "%i\n", &n);
d = (int*)calloc((n+1),sizeof(int*));
M = (int**)calloc((n+1),sizeof(int*));
for(i=0;i<n+1;i++)
{
M[i] = (int*)calloc(n+1,sizeof(int));
fscanf(f, "%i ", &d[i]);
}
FOR (i, 1, n - 1) M[i][i + 1] = d[i - 1] * d[i] * d[i + 1];
FOR (w, 2, n - 1) FOR (i, 1, n - w) {
int j = i + w;
M[i][j] = INF;
FOR (k, i, j - 1)
M[i][j] = Min(M[i][j], M[i][k] + M[k + 1][j] + d[i - 1] * d[k] * d[j]);
}
printf("Numarul minim de inmultiri este %i\n", M[1][n]);
for(i=0;i<n+1;i++)
{
for (j=0;j<n+1;j++)
printf("%i ",M[i][j]);
if (M[i][j]>0) M[i][j]=1;
printf("\n");
}
//afisare (M[][n], 0,n);
g= fopen ("podm.out", "w");
fprintf(g, "%i",M[1][n]);
fclose(f);
fclose(g);
return 0;
}
/*
program InmultireOptimalaMatrici;
const NMaxMatrici = 50;
infinit = 1000000000;
type IndiceMatrice = 1 .. NMaxMatrici;
var n,i,j,h,k,kmin: Indicematrice;
d: array[Indicematrice] of longint;
min: longint;
m: array[IndiceMatrice, IndiceMatrice] of longint;
procedure Citire;
var fin: text;
i: IndiceMatrice;
begin
assign (fin, 'mat.in'); reset (fin);
readln (fin, n);
for i := 1 to n + 1 do read (fin, d[i]);
readln (fin);
close (fin);
end;
procedure Afisare (i, j: IndiceMatrice);
begin
if i = j then write ('A', i)
else
begin
write('(');
Afisare (i, M[j,i]);
write (')*(');
Afisare (M[j,i]+1,j);
write(')');
end;
end;
begin
Citire;
for h := 1 to n -1 do
for i := 1 to n - 1 do
begin
j := i + h;
min := infinit;
for k := i to j - 1 do
if min > M[i, k] + M[k+1, j] + d[i] * d[k+1] * d[j+1] then
begin
min := M[i, k] + M[k+1, j] + d[i] * d[k+1] * d[j+1];
kmin := k;
end;
M[i, j] := min;
M[j,i] := kmin;
end;
writeln ('Numarul minim de inmultiri este ', M[1,n]);
writeln ('Solutia optima este:' );
Afisare (1,n);
writeln;
end.
*/