Computer Science/알고리즘

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

바보1 2023. 5. 13. 20:16

0.  문제 링크

 

 

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

 

11049번: 행렬 곱셈 순서

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

www.acmicpc.net


1.  풀이 방법

 

 


2.  코드

 

 

import sys
input = sys.stdin.readline


if __name__ == "__main__":
    n = int(input())
    maps = [[]] * n
    dp = [[float('inf')] * n for _ in range(n)]     # 최솟값을 구하기 위해 최댓값을 미리 넣어놓음

    for i in range(n):
        maps[i] = list(map(int, input().split()))

    for i in range(n):
        dp[i][i] = 0        # 대각선은 0으로 처리해놓음

    for dia in range(1, n):
        for i in range(n - dia):
            for k in range(i, i + dia):
                # i ~ i + dia까지 최적은 i ~ k, k + 1 ~ dia 까지 계산하면 됨
                # 여기서 최솟값을 찾으면 해결할 수 있음
                temp = maps[i][0] * maps[k][1] * maps[i + dia][1]
                dp[i][i + dia] = min(dp[i][i + dia], dp[i][k] + dp[k + 1][i + dia] + temp)

    print(dp[0][n - 1])

3.  마무리