​http://www.elijahqi.win/archives/453​

#include<cstdio>
#include<cstring>
int n,a[220],max,data[220][220];
void f(int i,int j){
if(i==j){
data[i][j]=0;
return;
}
int maxx=0,tmp=0;
for (int k=i;k<=j-1;++k){
if (data[i][k]==-1) f(i,k);
if (data[k+1][j]==-1) f(k+1,j);
tmp=data[i][k]+data[k+1][j]+a[i]*a[k+1]*a[j+1];
if (tmp>maxx) maxx=tmp;
}
data[i][j]=maxx;
}
int main(){
freopen("energy.in","r",stdin);
freopen("energy.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=n+1;i<=2*n;++i) a[i]=a[i-n];
for (int i=1;i<=n;++i){
memset(data,-1,sizeof(data));
f(i,i+n-1);
if (max<data[i][i+n-1]) max= data[i][i+n-1];
}
printf("%d",max);
return 0;
}