-
백준 11049 - 행렬 곱셈 순서, C++, DP쾌락없는 책임 (공부)/알고리즘 문제풀이 2021. 11. 4. 00:04반응형
#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를 잡아 양쪽에서의 최솟값을 구하게 됩니다.
반응형'쾌락없는 책임 (공부) > 알고리즘 문제풀이' 카테고리의 다른 글
백준 11000 - 강의실 배정, C++, 우선순위 큐, 그리디 (0) 2021.11.11 백준 1655 - 가운데를 말해요, C++, 우선순위 큐 (0) 2021.11.10 백준 2261 - 가장 가까운 두 점, C++, Closest Pair, 분할정복 (0) 2021.10.30 2261 백준 - 가장 가까운 두 점, Closest Pair 알고리즘, 분할정복 (0) 2021.10.09 백준 1300 - K번째 수, C++, 이분탐색 (0) 2021.09.21