-
행렬 곱셈 순서 - 11049Algorithm/BOJ 2020. 3. 3. 17:121234567891011121314151617181920212223242526272829303132333435363738394041424344//11049 - 행렬 곱셉 순서#include <iostream>#include <limits>using namespace std;#define INF INT32_MAXint N;int R[500];int C[500];int cache[500][500];void init(){cin >> N;for(int i = 0; i<N; ++i)cin >> R[i] >> C[i];for(int i = 0; i<N; ++i)for(int j = 0; j<N; ++j)cache[i][j] = -1;}int cal(int start, int mid, int end){return R[start]*C[mid]*C[end];}int dp(int start, int end){if(start == end) return 0;int& ret = cache[start][end];if(ret != -1)return ret;ret = INF;for(int mid = start; mid<end; ++mid)ret = min(ret, dp(start, mid) + dp(mid+1, end) + cal(start, mid, end));return ret;}int main(){init();cout << dp(0, N-1);}
cs https://www.acmicpc.net/problem/11049
11049번: 행렬 곱셈 순서
첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 231-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 231-1보다 작거나 같다.
www.acmicpc.net
행렬 곱셈 순서
DP문제 입니다.
C(i, j) : i~j 까지의 행렬을 곱하는 비용의 최소값
D(i, k, j) : i~k까지의 행렬들이 곱해진 행렬과 k+1~j까지의 행렬들이 곱해진 행렬을 곱하는데 드는 비용
C(i, j) = min(i < j < k){C(i, k) + C(k+1, j) + D(i, k, j)}
'Algorithm > BOJ' 카테고리의 다른 글
플로이드 - 11404 (0) 2020.03.03 섬의 개수 - 4963 (0) 2020.03.03 파일 합치기 - 11066 (0) 2020.03.02 가장 긴 바이토닉 부분 수열 - 11054 (0) 2020.03.01 가장 큰 정사각형 - 1915 (0) 2020.03.01