[BOJ] 파일 합치기

Date:

[BOJ] 파일 합치기

Problem URL : 파일 합치기

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define INF 987654321

using namespace std;

int dp[501][501];
int sum[501];

int main() {
	int TC;
	cin >> TC;
	for(int tc = 1; tc <= TC; tc++) {
		int N;
		cin >> N;
		int file;
		for (int i = 1; i <= N; i++) {
			cin >> file;
			sum[i] = sum[i - 1] + file;
		}

		for (int i = 1; i < N; i++) {
			for (int start = 1; start <= N - i; start++) {
				int end = start + i;
				dp[start][end] = INF;
				int SUM = sum[end] - sum[start - 1];
				for (int mid = start; mid <= end; mid++) {
					dp[start][end] = min(dp[start][end], dp[start][mid] + dp[mid + 1][end] + SUM); // [1]
				}
			}
		}
		cout << dp[1][N] << "\n";
	}
	return 0;
}

Comments

[1] 어떤 순서로 (어떤 mid 기준으로) 합쳐야 dp가 최소가 될지 결정하는 과정이다.

처음에는

임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 ‘연속’이 되도록 파일을 합쳐나가고

에서의 연속 조건을 인지하지 못해서 priority queue로 풀었는데 틀렸었다. 문제를 잘 읽도록 하자!

댓글