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 }