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 |