문제풀이/DP

[파이썬] [DP] 백준 11049 행렬 곱셈 순서

승무_ 2022. 12. 21. 11:12

문제

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

 

11049번: 행렬 곱셈 순서

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

www.acmicpc.net

코드

import sys
INF=sys.maxsize

n=int(input())

arr=[]

for i in range(n):
    t1, t2=map(int, input().split())
    arr.append((t1,t2))

dp=[[0]*n for _ in range(n)]

for i in range(1,n):
    for j in range(n-i):
        if i==1:
            dp[j][j+1]=arr[j][0]*arr[j][1]*arr[j+1][1]
            continue
        dp[j][j+i]=INF
        for k in range(j,j+i):
            dp[j][j+i]=min(dp[j][j+i],
                           dp[j][k]+dp[k+1][j+i]+arr[j][0]*arr[k][1]*arr[j+i][1])

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

생각 정리

dp[a][b]의 의미는 a행렬 부터 b행렬까지 행렬 곱의 최솟값이고

점점 거리(i)를 넓혀가면서 

 

ABCDE연속행렬 곱의 최솟값 =

min(ABCDE,

min(A) + min(BCDE) + 합치는 비용(A행 * A열 * E열),

min(AB) + min(CDE) + 합치는 비용(A행 * B열 * E열),

min(ABC) + min(DE) + 합치는 비용(A행 * C열 * E열),

min(ABCD) + min(E) + 합치는 비용(A행 * D열 * E열)

)

 

최솟값을 구해준다.