package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	for {
		scanner := bufio.NewScanner(os.Stdin)

		// 设置大缓冲区,防止大输入时出错
		buf := make([]byte, 1024*1024) // 1MB
		scanner.Buffer(buf, 1024*1024)
		scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔)

		// 读取第一行:n
        var num int
		n, _ := fmt.Scan(&num)
		if n == 0 {
			break
		} else {
			arr := make([]int, num)
			for i := 0; i < len(arr); i++ {
				scanner.Scan()
				arr[i], _ = strconv.Atoi(scanner.Text())

			}
			fmt.Println(process(arr))
		}
	}
}

func process(arr []int) int {
	nums := make([]int, len(arr)+2)
	nums[0], nums[len(nums)-1] = 1, 1
	copy(nums[1:], arr)

	dp := make([][]int, len(nums))
	for i := 0; i < len(dp); i++ {
		dp[i] = make([]int, len(nums))
	}
   // 开区间的解法,和闭区间不一样
	for length := 2; length < len(nums); length++ {
		for i := 0; i+length < len(nums); i++ {
			j := i + length
			for k := i + 1; k < j; k++ {
				dp[i][j] = max(dp[i][j], nums[i]*nums[k]*nums[j]+dp[i][k]+dp[k][j])
			}
		}
	}
	return dp[0][len(nums)-1]
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}