https://www.acmicpc.net/problem/11049
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 |
댓글