쾌락없는 책임 (공부)/알고리즘 문제풀이

백준 11049 - 행렬 곱셈 순서, C++, DP

허스크 2021. 11. 4. 00:04
반응형

 

11049번: 행렬 곱셈 순서

첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같

www.acmicpc.net

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int n, r, c, res = 0;
pair<int, int> matrix[501];
int dp[501][501];   // left ~ right : 최소 연산 횟수

int MultiplyMatrix(int left, int right){
    if(left == right)
        return 0;
    
    int minimum = 999999999;

    if(dp[left][right] != -1)
        return dp[left][right];

    for(int i = left; i < right; i++){
        minimum = min(minimum, MultiplyMatrix(left, i) + MultiplyMatrix(i+1, right)
                    + (matrix[left].first * matrix[i].second * matrix[right].second));
    }
    dp[left][right] = minimum;
    return minimum;
}

int main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    // input
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> matrix[i].first >> matrix[i].second;
    }

    // init
    memset(dp, -1, sizeof(dp));

    // solve
    cout << MultiplyMatrix(0, n-1) << '\n';
}

  또다시 학교 알고리즘 수업에 배운 내용들이다. solved.ac에서 클래스 기준으로 찾다가 비슷한 문제를 찾아 풀이를 했는데 아마 대부분 비슷하게 풀지 않을까 싶다.

 

- 처음 left, right 범위를 정합니다.

- dp 배열의 경우 left~right까지 했을 때 곱셈 연산의 최솟값을 담을 생각입니다.

- 함수의 for문에서는 중간점 i를 잡아 양쪽에서의 최솟값을 구하게 됩니다.

반응형