https://www.acmicpc.net/problem/11049
- 다이나믹 프로그래밍
import sys
input = sys.stdin.readline
N = int(input())
matrix = []
for _ in range(N):
matrix.append(tuple(map(int, input().split())))
# dp[i][j] = 행렬 i~j까지 곱했을 때, 곱셈 연산 횟수의 최솟값
dp = [[0]*N for _ in range(N)]
# 대각선↘︎으로 순회하며 값 채우기
for idx in range(1, N):
for i in range(N):
j = i + idx
if j < N:
if j == i+1:
dp[i][j] = matrix[i][0] * matrix[j][0] * matrix[j][1]
else:
dp[i][j] = 2**31 - 1
# (i~x) * (x~j)
# A(BCD) | (AB)(CD) | (ABC)D
for x in range(i, j+1):
if x == i:
dp[i][j] = min(dp[i][j],
dp[i+1][j] + matrix[i][0]*matrix[i+1][0]*matrix[j][1])
elif x == j:
dp[i][j] = min(dp[i][j],
dp[i][j-1] + matrix[i][0]*matrix[j][0]*matrix[j][1])
else:
dp[i][j] = min(dp[i][j],
dp[i][x] + dp[x+1][j] + matrix[i][0]*matrix[x+1][0]*matrix[j][1])
print(dp[0][N-1])
5*3
, 3*2
, 2*6
, 6*4
일 때dp[i][i+1] = matrix[i][0]*matrix[i+1][0]*matrix[i+1][1]
문제에서 제시한 최대값
)으로 둔 뒤,if x == i:
dp[i][j] = min(dp[i][j],
# (i+1) ~ j 까지의 최소 연산 횟수 + 행렬i와 행렬((i+1)~j)곱의 결과를 곱하는 횟수
dp[i+1][j] + matrix[i][0]*matrix[i+1][0]*matrix[j][1])
elif x == j:
dp[i][j] = min(dp[i][j],
# i~(j-1) 까지의 최소 연산 횟수 + 행렬(i~(j-1))곱의결과와 행렬j를 곱하는 횟수
dp[i][j-1] + matrix[i][0]*matrix[j][0]*matrix[j][1])
else:
dp[i][j] = min(dp[i][j],
# i~x까지의 최소 연산 횟수 + (x+1)~j까지의 최소 연산 횟수 + 행렬(i~x)곱의 결과와 행렬(x+1~j)곱의 결과를 곱하는 횟수
dp[i][x] + dp[x+1][j] + matrix[i][0]*matrix[x+1][0]*matrix[j][1])