알고리즘/BOJ

백준 11049번 행렬 곱셈 순서

꾸준함. 2018. 3. 20. 21:37

문제 링크입니다: 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