[백준][11049] 행렬 곱셈 순서
이 포스트는 백준 사이트의 행렬 곱셈 순서 문제 풀이입니다.
문제
해결 과정
이 문제는 여러 작은 문제로 나워서 해결하는 DP(다이나믹 프로그래밍) 방법을 사용해 해결할 수 있습니다.
문제를 해결하기 위해서 먼저, DP 테이블을 사용하였습니다.
2차원 배열의 테이블은 DP_table[a][b]에서 a번째 행렬부터 b번째 행렬까지의 곱 중 최소 곱셈 횟수를 기록하였습니다.
따라서 모든 연산이 완료된 후 DP_table[1][N]을 출력하면 N개의 행렬을 곱할 때의 최소 곱셈 횟수를 알 수 있습니다.
코드 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 510
using namespace std;
int main()
{
int N;
cin.tie(0);
cin >> N;
vector<vector<int>> matrix(MAX, vector<int>(2, 0));
vector<vector<int>> DP_table(MAX, vector<int>(MAX, 0));
for (int i = 1; i <= N; ++i) {
cin >> matrix[i][0] >> matrix[i][1];
}
for (int i = 1; i < N; ++i) {
for (int j = 1; i + j <= N; ++j) {
DP_table[j][i + j] = 2e9;
for (int k = j; k <= i + j; ++k) {
int new_count = DP_table[j][k] + DP_table[k + 1][i + j]
+ (matrix[j][0] * matrix[k][1] * matrix[i + j][1]);
DP_table[j][i + j] = min(DP_table[j][i + j], new_count);
}
}
}
cout << DP_table[1][N];
return 0;
}
실행 결과
참고
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.