dp로 푼다.

기본적인 풀이 방법

스크린샷 2023-03-11 오후 1.43.48.png

행렬의 곱셈 에는 결합 법칙이 적용된다.

따라서 무엇을 먼저 곱하냐 에 따라 연산 수 가 변화한다.

스크린샷 2023-03-11 오후 1.48.52.png

즉 행렬 곱셈 문제는 연산 수가 가장 적은 방식을 찾는 것 , 연산의 순서를 찾는 것이다.

스크린샷 2023-03-11 오후 1.53.21.png

스크린샷 2023-03-11 오후 2.12.17.png

스크린샷 2023-03-11 오후 2.29.48.png

스크린샷 2023-03-11 오후 2.34.16.png

import Foundation
func solution() {
    let n = Int(readLine()!)!
    var p = Array(repeating: 0, count: n + 2)
    for i in 1 ... n {
        let arr = readLine()!.split(separator: " ").map { String($0) }
        p[i] = Int(arr.first!)!
        if i == n {
            p[i + 1] = Int(arr.last!)!
        }
    }
    //
    if n == 1 {
        print(p[1] * p[2])
        return
    }
        
    //
    var dp = Array(repeating: Array(repeating: Int.max, count: n + 1), count: n + 1)
    for i in 1 ... n {
        dp[i][i] = 0
    }
		//
    for d in 2 ... n {
        for i in 1 ... ((n - d) + 1) {
            let j = (d + i) - 1
            // print("--", i, j)
            for k in i ..< j {
                // print(i,k, k+1, j)
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + (p[i] * p[k + 1] * p[j + 1]))
            }
        }
    }

    print(dp[1][n])
}

solution()