__int128

#define int long long
using namespace std;
template <class T> inline void read(T& x) { x = 0; char c = getchar(); bool f = 0; for (; !isdigit(c); c = getchar()) f ^= (c == '-'); for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48); x = f ? -x : x; }
template <class T> inline void write(T x) { if (x < 0) putchar('-'), x = -x; if (x < 10) putchar(x + 48); else write(x / 10), putchar(x % 10 + 48); }
const int N = 3e5+4;

int n;
inline void sol(){
	read(n);
	vector<__int128> a(n+1,0);
	for(int i=1;i<=n;i++) read(a[i]);
	//选点来考虑会比较抽象,我们考虑怎么选边来考虑,因为我们选中一条定边后,剩下要做的事就是找出三角形剩下的那个点,从而确定图形 
	//设f[i][j] 顶点i~顶点j三角剖分后的max乘积 
	//现在i到j这条边选上,然后考虑i~j中的某一个顶点作为第三个点
	//则有 f[i][j] = min(f[i][k] + f[k][j] + a[i]*a[j]*a[k]
	//最后我们选定1,n连接的边(跨数组)来定结果 答案即f[1][n] 
	vector<vector<__int128>> f(n+1,vector<__int128>(n+1,0));
	for(int len = 3; len <= n; len++){
		for(int l = 1; ; l++){
			int r = l + len - 1;
			if(r > n) break;
			f[l][r] = 1e30;
			for(int k = l + 1; k < r; k++)
				f[l][r] = min(f[l][r],f[l][k] + f[k][r] + a[l]*a[r]*a[k]);
		}
	}
	write(f[1][n]), putchar('\n');
}

signed main(){
	int ttt= 1;
	while(ttt--) sol();
	return 0;
}