[문제 링크]

 

11066번: 파일 합치기

문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 ��

www.acmicpc.net


연속한 페이지끼리 합쳐야된다는 것을 모르고 풀어서 고생한 문제였다.

이 사실을 알고난 후로도 풀이법을 못떠올려서 다른 사람들의 블로그를 참고했다.

다양한 방법으로 풀이해보는 것을 더 연습해야겠다.


#include <iostream>
#include <cstring>
using namespace std;

const int INF = 987654321;
int arr[501], sum[501], memo[501][501];

int min(int a, int b) { return a < b ? a : b; }

int Topdown(int start, int end)
{
	if (start >= end) return 0;
	if (start + 1 == end) return arr[start] + arr[end];

	int& ret = memo[start][end];
	if (ret != -1) return ret;

	ret = INF;

	for (int i = start; i <= end; i++)
		ret = min(ret, Topdown(start, i) + Topdown(i + 1, end) + sum[end] - sum[start - 1]);

	return ret;
}

int main(void)
{
	int tc;
	cin >> tc;
	while (tc--)
	{
		memset(memo, -1, sizeof(memo));
		memset(sum, 0, sizeof(sum));

		int K;
		cin >> K;
		for (int i = 1; i <= K; i++)
		{
			cin >> arr[i];
			sum[i] = sum[i - 1] + arr[i];
		}

		cout << Topdown(1, K) << endl;
	}

	return 0;
}

알고리즘 200일 프로젝트 - 94 day

'알고리즘 > BOJ' 카테고리의 다른 글

백준 10942번: 팰린드롬?  (0) 2020.07.09
백준 2096번: 내려가기  (0) 2020.07.09
백준 1915번: 가장 큰 정사각형  (0) 2020.07.06
백준 1965번: 상자넣기  (0) 2020.07.06
백준 6359번: 만취한 상범  (0) 2020.07.06

+ Recent posts