파일 합치기

11 August 2019

문제 : https://www.acmicpc.net/problem/11066

이번은 파일을 합쳐 하나로 모으는 최소 비용을 구하는 문제를 풀어보도록 하겠습니다.

#include<stdio.h>

int getMin(int start, int end);

static int* arr;
static int** cache;

void initCache(int length) {
	cache = new int*[length];
	for (int k = 0; k < length; k++)
	{
		cache[k] = new int[length];
		for (int m = 0; m < length; m++)
		{
			cache[k][m] = -1;
		}
	}
}

int main(void) {

	int N, length, val;

	scanf("%d", &N);

	for (int i = 0; i < N; i++)
	{
		scanf("%d", &length);
		initCache(length);
		arr = new int[length];
		for (int k = 0; k < length; k++)
		{
			scanf("%d", &val);
			arr[k] = val;
		}

		printf("%d\n", getMin(0, length - 1));

	}

	return 0;
}

int getMin(int start, int end) {

	if (start >= end)
	{
		return 0;
	}

	if (cache[start][end] != -1)
	{
		return cache[start][end];
	}

	if (end - start == 1)
	{
		return arr[start] + arr[end];
	}

	int sum = 0;
	for (int i = start; i <= end; i++)
	{
		sum += arr[i];
	}

	
	for (int i = start; i < end; i++)
	{
		int ret = getMin(start, i) + getMin(i + 1, end) + sum;
		if (cache[start][end] == -1 || ret < cache[start][end])
		{
			cache[start][end] = ret;
		}
	}

	return cache[start][end];
}
문제에서는 파일의 두 부분을 합친다고만 써있지만, 실제로 구현을 진행해보면 나란히 붙어있는 두 개의 파일만 붙여야 답이 맞다는 것을 알게 됩니다.
인근의 두 파일을 붙이는 로직이므로 예를 들어 1부터 4까지의 최소 파일 합을 구한다고 하면,
f(1,4) = Math.min(f(1,1)+f(2,4), f(1,2)+f(3,4),f(1,3)+f(4,4))
로 표현할 수 있습니다.
쪼개질 수 없는 처음 단위의 파일은 더해질 때 본인의 수는 더하지 않으므로,
f(1,2) = arr[1] + arr[2]
f(1,1) = 0
이 되게 됩니다.
위와 같이 구현하여 값을 return 해주도록 합니다.