#include <stdio.h>
#include <limits.h>
#define lld long long int
#define min(a,b) (a<b?a:b)
#define INF (LONG_LONG_MAX)
#define MAX_N 500
lld D[MAX_N+1][MAX_N+1],dim[MAX_N+1];
void rec_print(int i,int j,FILE *f)//recursive printer
{
//printf("%lld\n",D[j][i]);
if(i==j)
{
fprintf(f,"%d",i);
}
else
{
fprintf(f,"(");
rec_print(i,D[j][i],f);
fprintf(f,"*");
rec_print(D[j][i]+1,j,f);
fprintf(f,")");
}
}
int main()
{
FILE *fin=fopen("podm.in","r"),
*fout=fopen("podm.out","w");
int n;
int i,j,diag,k;
int nrop;
fscanf(fin,"%d",&n);
for(i=0;i<n+1;i++)
{
fscanf(fin,"%lld",&dim[i]);
}
//diagonala 1-> 0
for(i=1;i<=n;i++)
D[i][i]=0;
//diagonala 2-> cate operatii e nevoie pt a inmultii matricea i cu i+1
for(i=1;i<=n-1;i++)
D[i][i+1]=dim[i-1]*dim[i]*dim[i+1];
//diagonala ramase-> calculeaza unde trbuie pusa o spartura optim
for(diag=2;diag<=n-1;diag++)
{
for(i=1;i<=n-diag;i++)
{
j=i+diag;
D[i][j]=INF;
for(k=i;k<=j-1;k++)
{
// D[i][j]=min(
// D[i][j],
// D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j]
// );
nrop=D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j];
if(D[i][j]>nrop)
{
D[i][j]=nrop;
D[j][i]=k;
}
// if(D[i][j]<D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j])
// printf("D[%d][%d]-ramane acelas(%d)\n",i,j,k);
// else
// printf("D[%d][%d]: %lld = %lld+%lld+%lld*%lld*%lld (%d)\n",i,j,D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j],
// D[i][k],D[k+1][j],dim[i-1],dim[k],dim[j],k),D[j][i]=k;
}
}
}
// for(i=1;i<=n;i++){
// for(j=1;j<=n;j++)
// printf("%04lld ",D[i][j]);
// printf("\n");
// }
fprintf(fout,"%lld\n",D[1][n]);
//rec_print(1,n,fout);
fclose(fin);
fclose(fout);
return 0;
}