Study hard
(c++)백준 11049번: 행렬 곱셈 순서 본문
11049번: 행렬 곱셈 순서
첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같�
www.acmicpc.net
[풀이]
재귀 DP로 풀 수 있는 문제였다.
DP[i][j] : i번째 행렬부터 j번째 행렬까지 곱하는데 필요한 곱셈 연산의 최솟값
점화식
DP[i][j] = min(DP[i][j], DP[i][k] + DP[k+1][j] + Matrix[i].r*Matrix[k].c*Matrix[j].c)
#include <iostream>
#include <cstring>//memset
#include <algorithm>//min
#include <vector>
using namespace std;
struct M {
int r, c;
};
int N;
int DP[501][501];
vector<M>v;
int solution(int s,int e) {
if (s >= e)
return 0;
int& res = DP[s][e];
//이미 구해놨으면
if (res != -1)
return res;
res = 999999999;
for (int i = s; i <= e; i++) {
res = min(res, solution(s, i) + solution(i + 1, e) + v[s].r*v[i].c*v[e].c);
}
return res;
}
int main() {
cin >> N;
int r, c;
memset(DP, -1, sizeof(DP));
v.push_back({ 0,0 });
for (int i = 1; i <= N; i++) {
cin >> r >> c;
v.push_back({ r,c });
}
cout << solution(1, N) << '\n';
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 14238번: 출근 기록 (0) | 2020.09.18 |
---|---|
(c++)백준 5557번: 1학년 (0) | 2020.09.18 |
(c++)백준 1890번: 점프 (0) | 2020.09.16 |
(c++)백준 11058번: 크리보드 (0) | 2020.09.16 |
(c++)백준 2294번: 동전 2 (0) | 2020.09.16 |