55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
# 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])
|
|
|