문제 링크입니다: https://www.acmicpc.net/problem/11049
left~right까지 행렬을 곱했을 경우 최소 연산 횟수가 cache[left][right]에 저장되고 이를 2개의 부분문제로 바꾸는 것이 핵심이였습니다.
#include <iostream>
#include <algorithm>
#include <cstring> //memset
using namespace std;
const int MAX = 500;
const int INF = 987654321;
int N;
pair<int, int> matrix[MAX];
int cache[MAX][MAX];
//left~right까지 연산하는데 드는 비용
int minCalc(int left, int right)
{
if (left == right)
return 0;
int &result = cache[left][right];
if (result != -1)
return result;
result = INF;
for (int i = left; i < right; i++)
//두 부분으로 나눈다
result = min(result, minCalc(left, i) + minCalc(i + 1, right) + matrix[left].first*matrix[i].second*matrix[right].second);
return result;
}
int main(void)
{
cin >> N;
for (int i = 0; i < N; i++)
cin >> matrix[i].first >> matrix[i].second;
memset(cache, -1, sizeof(cache));
cout << minCalc(0, N - 1) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2352번 반도체 설계 (0) | 2018.03.29 |
---|---|
백준 5582번 공통 부분 문자열 (1) | 2018.03.25 |
백준 2169번 로봇 조종하기 (0) | 2018.03.19 |
백준 5557번 1학년 (1) | 2018.03.17 |
백준 1495번 기타리스트 (0) | 2018.03.16 |