거의 알고리즘 일기장

백준 11049번 _ 행렬 곱셈 순서 본문

알고리즘 문제풀이

백준 11049번 _ 행렬 곱셈 순서

건우권 2020. 5. 4. 14:51

https://www.acmicpc.net/problem/11049

 

11049번: 행렬 곱셈 순서

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

www.acmicpc.net

주의사항

1. 크기가 N×M인 행렬 A와 M×K인 B를 곱할 때 필요한 곱셈 연산의 수는 총 N×M×K번이다.

2. 입력으로 주어진 행렬의 순서를 바꾸면 안 된다.


풀이방법

https://kunkunwoo.tistory.com/101

 

백준 11066번 _ 파일 합치기

https://www.acmicpc.net/problem/11066 11066번: 파일 합치기 문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각..

kunkunwoo.tistory.com

이 문제와 거의 동일한 문제다. 다른 점이 있다면 점화식이

dp[start][end] = dp[start][mid] + dp[mid+1][end] + (start의 첫번째 * mid의 두번째 * end의 두번째) 이렇게 뒷부분이 이 문제에 맞게 조금 다르다는 점 정도다.


전체코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <limits.h>

using namespace std;

long long dp[501][501];
vector<pair<int, int>> matrix;
int n;

void Input()
{
	cin >> n;
	int start, end;
	for (int i = 0; i < n; i++)
	{
		cin >> start >> end;
		matrix.push_back({ start, end });
	}
}

void solve()
{
	for (int gap = 1; gap < n; gap++)
	{
		for (int start = 0; start+gap < n; start++)
		{
			int end = start + gap;
			dp[start][end] = LLONG_MAX;

			for (int mid = start; mid < end; mid++)
			{
				dp[start][end] = min(dp[start][end], dp[start][mid] + dp[mid + 1][end]+ (matrix[start].first * matrix[mid].second * matrix[end].second));
			}
		}
	}
	cout << dp[0][n - 1] << endl;
}

int main()
{
	Input();
	solve();
	return 0;
}

후기

어제 고민해서 푼 문제와 거의 동일한 문제라 풀기 수월했다.

반응형

'알고리즘 문제풀이' 카테고리의 다른 글

백준 7579번 _ 앱  (0) 2020.05.05
백준 1520번 _ 내리막 길  (0) 2020.05.04
백준 11066번 _ 파일 합치기  (1) 2020.05.04
백준 2293번 _ 동전 1  (0) 2020.05.03
백준 11657번 _ 타임머신  (0) 2020.05.03
Comments