문제 : https://www.acmicpc.net/problem/11049
[ 알고리즘풀이 ]
2차원 DP 배열을 이용해 문제를 해결해야합니다.
'DP[x][y] = x번 째 행렬부터 y번 째 행렬까지 곱했을 때 최소 연산의 수' 로 정의하겠습니다.
그러면 다음과 같은 점화식이 성립합니다.
for K = i+1~j-1,
DP[i][j] = min(D[i][K] +D[K][j] + matrix[i]의 row * matrix[K]의 row * matrix[j]의 col)
따라서, 다음과 같은 순서로 DP 배열을 채워나갈 수 있습니다.
DP배열 |
1번 행렬 |
2번 행렬 |
3번 행렬 |
4번 행렬 |
1번 행렬 |
0 |
네번째 |
다섯번째 |
여섯번째 |
2번 행렬 |
0 |
0 |
두번째 |
세번째 |
3번 행렬 |
0 |
0 |
0 |
첫번째 |
4번 행렬 |
0 |
0 |
0 |
0 |
#include<iostream>
#include<vector>
#include<algorithm>
#define INT_MAX 2147483647
using namespace std;
int dp[505][505] = {};
vector<pair<int, int>> list;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, x, y;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> x >> y;
list.push_back(make_pair(x, y));
}
for (int i = N - 1; i >= 0; i--) {
for (int j = i + 1; j < N; j++) {
dp[i][j] = INT_MAX;
for (int k = i; k <= j; k++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + list[i].first * list[k].second * list[j].second);
}
}
}
cout << dp[0][N - 1];
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 2530 : 인공지능 시계 - travelbeeee (0) | 2020.02.06 |
---|---|
[BOJ] 2225 : 합분해 - travelbeeee (0) | 2020.02.06 |
[BOJ] 10826 : 피보나치 수 4 - travelbeeee (0) | 2020.02.05 |
[BOJ] 18242 : 네모네모 시력검사 - travelbeeee (0) | 2020.02.05 |
[BOJ] 10164 : 격자상의 경로 - travelbeeee (0) | 2020.02.05 |