Study hard

(c++)백준 11049번: 행렬 곱셈 순서 본문

백준/DP

(c++)백준 11049번: 행렬 곱셈 순서

Nimgnoej 2020. 9. 16. 20:34

www.acmicpc.net/problem/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