#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
typedef vector<int> VI;
const int mod = 1e8;
using ull = unsigned long long;
int n;
int head[4000];
int tail[4000];
int dp[2500][2500];
int res = 0 ;
/*
*用取模解决问题吧
* */
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>head[i];
}
for(int i=1;i<=n;i++){
tail[(i-1)%n + 1] = head[i%n+1];
}
for(int i=1;i<=n;i++){
head[n+i] = head[i];
tail[n+i] = tail[i];
}
for(int len=2;len<=n;len++){
for(int i=1;i+len-1 <= 2*n;i++){
int j = i+len-1;
for(int k=i;k<j;k++){
int c = head[i] * tail[k] * tail[j];
dp[i][j] = max(dp[i][j] , dp[i][k] + dp[k+1][j] + c);
}
}
}
for(int i=1;i<=n;i++){
res = max(res,dp[i][i+n-1]);
}
cout<<res;
}
区间dp 和合并石子区别不大