# import sys # input = sys.stdin.readline # INF = float("inf") # N = int(input()) # size = [list(map(int, input().split())) for _ in range(N)] # dp = [[0]*N for _ in range(N)] # for length in range(2, N+1) : # for start in range(N-length+1) : # end = start + length - 1 # dp[start][end] = INF # for k in range(start, end) : # left_cost = dp[start][k] # right_cost = dp[k+1][end] # merge_cost = size[start][0]*size[k][1]*size[end][1] # current_cost = left_cost + right_cost + merge_cost # dp[start][end] = min(dp[start][end], current_cost) # print(dp[0][N-1]) import sys input = sys.stdin.readline N = int(input()) matrix = [list(map(int, input().split())) for _ in range(N)] dp = [[0]*N for _ in range(N)] kk = [[0]*N for _ in range(N)] for i in range(N): kk[i][i] = i for length in range(1, N): for i in range(N - length): j = i + length dp[i][j] = float('inf') start_k = kk[i][j-1] end_k = kk[i+1][j] for k in range(start_k, end_k + 1): if k >= N-1: continue val = dp[i][k] + dp[k+1][j] + matrix[i][0] * matrix[k][1] * matrix[j][1] if val < dp[i][j]: dp[i][j] = val kk[i][j] = k print(dp[0][N-1])