Study hard
(c++)백준 11066번: 파일 합치기 본문
11066번: 파일 합치기
소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본
www.acmicpc.net


[풀이]
DP로 풀 수 있는 문제였다.
DP[i][j] : i번째 장부터 j번째 장까지 어떤 순서로 합쳐야 최소비용이 나오는지(그 때의 최소비용)
Sum[i] : 1장 ~ i장 비용 합
점화식
DP[i][[j] = min(DP[i][j], DP[i][k] + DP[k+1][j] + Sum[j] - Sum[i-1]) (여기서 Sum[j] - Sum[i-1]은 i~j번째 장을 최종으로 합칠 때 드는 비용, k는 몇번째 장에서 끊을지)
재귀를 사용하였다.
#include <iostream>
#include <cstring>//memset
#include <algorithm>//min
using namespace std;
int K;
int C[501];
int Sum[501];
int DP[501][501];
int solution(int s, int e) {
//s가 e보다 크거나 같아지면
if (s >= e)
return 0;
//두 장만 남았으면
if (s + 1 == e)
return C[s] + C[e];
int &res = DP[s][e];
//이미 최소 비용 구해놨으면 반환해줌
if (res != -1)
return res;
res = 99999999;
for (int i = s; i <= e; i++) {
res = min(res, solution(s, i) + (solution(i + 1, e) + Sum[e] - Sum[s - 1]));
}
return res;
}
int main() {
int T;
cin >> T;
while (T--) {
cin >> K;
memset(Sum, 0, sizeof(Sum));
memset(DP, -1, sizeof(DP));
for (int i = 1; i <= K; i++) {
cin >> C[i];
Sum[i] = Sum[i - 1] + C[i];
}
cout << solution(1, K) << '\n';
}
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 1459번: 기타리스트 (0) | 2020.09.15 |
---|---|
(c++)백준 12865번: 평범한 배낭 (0) | 2020.09.15 |
(c++)백준 15989번: 1, 2, 3 더하기 4 (0) | 2020.09.14 |
(c++)백준 10942번: 팰린드롬? (0) | 2020.09.14 |
(c++)백준 15486번: 퇴사 2 (0) | 2020.09.14 |