d[i][j]:在区间a[i]~a[j]范围内能取到的最大值
d[i][j]=min{d[i][k]+a[k]*a[k+1]*a[k+2]+d[k+2][j]}
i+1=<k<=j-1
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int d[maxn][maxn];
int n;
int a[maxn];
int dp(int l,int r)
{
if (l+2>r) return 0;
if (d[l][r]>0) return d[l][r];
int ans=1<<30;
for (int i=l+1;i<=r-1;i++){
ans=min(ans,dp(l,i)+a[l]*a[i]*a[r]+dp(i,r));
}
return d[l][r]=ans;
}
void init()
{
memset(d,0,sizeof(d));
for (int i=1;i<=n-2;i++){
d[i][i+2]=a[i]*a[i+1]*a[i+2];
}
}
int main()
{
while(scanf("%d",&n)!=EOF){
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
init();
dp(1,n);
int ans=1<<30;
for (int i=2;i<n;i++){
ans=min(ans,d[1][i]+a[1]*a[i]*a[n]+d[i][n]);
}
printf("%d\n",ans);
}
return 0;
}