본문 바로가기
알고리즘/BOJ

[Python] 백준 11049: 행렬 곱셈 순서

by PIAI 2021. 10. 2.

https://www.acmicpc.net/problem/11049

 

11049번: 행렬 곱셈 순서

첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같

www.acmicpc.net

1. ABCD 의 행렬이 주어졌을경우 행렬은 A(BCD), (AB)(CD), (ABC)D 총 4가지 경우의 수가 나오고 A(BCD)의 경우 BCD = B(CD), (BC)D 로 다시 쪼개진다.

2. 행렬은 r * c 이므로 각 행렬의 항을 a항에 넣어주면 점화식은

dy[s][e] = dy[s][k] + dy[k][e] + a[s]*a[k]*a[e]  (s+1 <=k <e)

3. 행렬의 곱은 행렬이 2개이상일때부터 성립함으로 (e-s >= 2) 이다

INF = 2**31
n = int(input())
dy = [[INF for _ in range(n+1)] for _ in range(n+1)]
a = [0 for _ in range(n+1)]

def dfs(s, e):
    if e-s <= 1:
        return 0
    if dy[s][e] != INF:
        return dy[s][e]
    for k in range(s+1, e):
        dy[s][e] = min(dy[s][e], dfs(s, k)+dfs(k, e)+a[s]*a[k]*a[e])
    return dy[s][e]

for i in range(n):
    a[i], a[i+1] = map(int, input().split())
    dy[i][i], dy[i][i+1] = 0, a[i]*a[i+1]

dfs(0, n)
print(dy[0][n])

 

'알고리즘 > BOJ' 카테고리의 다른 글

[Python] 백준 5554: 1학년  (0) 2021.10.03
[Python] 백준 10942: 팰린드롬?  (0) 2021.10.03
[Python] 백준 17070: 파이프 옮기기 1  (0) 2021.10.02
[Python] 백준 1132: 합  (0) 2021.09.29
[Python] 백준 17371: 이사  (0) 2021.09.27

댓글