1) 지금 단계의 해답 = 부분문제의 해답 + 추가 계산
1) 분할정복
2) 행렬 곱 횟수 = 부분행렬 곱 횟수 + 현재 행렬의 곱 횟수
def solve(sidx, eidx)
...
count = solve(sidx, i) + solve(i+1, eidx)
count += data[sidx][0] * data[i][1] * data[eidx][1]
dp[sidx][eidx] = min(dp[sidx][eidx], count )
"""
DP
dp[sidx][eidx] = min(dp[sidx][i] + dp[i][eidx]) + sidx ~ i 행렬 x i ~ eidx 행
"""
import sys
# sys.setrecursionlimit(10**6)
def solve(sidx, eidx):
# print(sidx, eidx)
# 가장 밑에 있는 재귀 처리
if sidx == eidx:
return 0
# 가장 밑에 있는 재귀 처리
if sidx + 1 == eidx:
dp[sidx][eidx] = data[sidx][0] * data[sidx][1] * data[eidx][1]
return dp[sidx][eidx]
# 메모이제이션
if dp[sidx][eidx] != 0:
return dp[sidx][eidx]
dp[sidx][eidx] = sys.maxsize
for i in range(sidx, eidx):
# 분할정복
count = solve(sidx, i) + solve(i+1, eidx)
# 현재단계에서 필요한 추가 연산
count += data[sidx][0] * data[i][1] * data[eidx][1]
# 최솟값 계산
dp[sidx][eidx] = min(dp[sidx][eidx], count )
return dp[sidx][eidx]
sys.stdin = open('./11049.txt')
n = int(input())
dp = [[0 for _ in range(n)] for _ in range(n)]
data = []
for i in range(n):
line = list(map(int, input().split()))
data.append(line)
out = solve(0, n-1)
print(out)