Skip to content

Commit d05c110

Browse files
sk25a068ing-eoking
authored andcommitted
[오늘의 알고리즘] 최적의 행렬 곱셈
1 parent 1e2cf8c commit d05c110

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
def solution(matrix_sizes):
2+
n = len(matrix_sizes)
3+
4+
# 행렬이 1개면 곱셈 연산이 필요 없음
5+
if n <= 1:
6+
return 0
7+
8+
# dp[i][j] = i번째 행렬부터 j번째 행렬까지 곱할 때 필요한 최소 스칼라 곱셈 연산 수
9+
dp = [[0] * n for _ in range(n)]
10+
11+
# 행렬 차원 정보를 하나의 배열로 재구성
12+
# dimensions[i]은 i번째 행렬의 행 수, dimensions[i+1]는 i번째 행렬의 열 수
13+
dimensions = []
14+
dimensions.append(matrix_sizes[0][0])
15+
for i in range(n):
16+
dimensions.append(matrix_sizes[i][1])
17+
18+
# 길이가 2인 체인부터 n인 체인까지 계산
19+
for length in range(2, n + 1):
20+
for i in range(n - length + 1):
21+
j = i + length - 1
22+
dp[i][j] = float('inf')
23+
for k in range(i, j):
24+
# A_i x ... x A_k와 A_{k+1} x ... x A_j를 곱하는 연산 비용 계산
25+
cost = dp[i][k] + dp[k+1][j] + dimensions[i] * dimensions[k+1] * dimensions[j+1]
26+
if cost < dp[i][j]:
27+
dp[i][j] = cost
28+
29+
return dp[0][n-1]

0 commit comments

Comments
 (0)