문 제
소 스 코 드
#include <iostream>
#include <algorithm>
constexpr int MAX{ 0x7fff'ffff };
void SearchLowCost();
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
int T;
std::cin >> T;
for (int i = 0; i < T; ++i) SearchLowCost();
return 0;
}
void SearchLowCost() {
int K;
std::cin >> K;
int *sum { new int[K + 1] };
int data;
std::fill_n(sum, K + 1, 0);
for (int i = 1; i <= K; ++i) {
std::cin >> data;
sum[i] = sum[i - 1] + data;
}
int **dp { new int*[K + 1] };
for (int i = 0; i <= K; ++i) {
dp[i] = { new int[K + 1] };
std::fill_n(dp[i], K + 1, 0);
}
for (int i = 1; i < K; ++i) {
for (int x = 1; x + i <= K; ++x) {
int y = x + i;
dp[x][y] = MAX;
for (int m = x; m < y; ++m) {
dp[x][y] = std::min(dp[x][y], dp[x][m] + dp[m + 1][y] + sum[y] - sum[x - 1]);
}
}
}
std::cout << dp[1][K] << '\n';
for (int i = 0; i < K + 1; ++i) delete[] dp[i];
delete[] dp;
delete[] sum;
}
풀 이
더보기
문제에 "소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다."라는 말을 통하여 두 개를 선택할 경우 옆에 있어야 하는 것을 알 수 있다.
이와 유사한 방법이 연쇄행렬 최소곱셈이다.
dp[i][j] : i번째 ~ j번째 까지 합치는데 드는 최소한의 비용.
그러므로, min(dp[i][k] + dp[k+1][j] + novel의 i ~ j까지의 합, dp[i][j]) 인 것을 알 수 있다.
출 력 값
문 제 출 처
문제 링크 : https://www.acmicpc.net/problem/11066
11066번: 파일 합치기
문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 ��
www.acmicpc.net
'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글
[BAEKJOON] 1520번 : 내리막 길 * (0) | 2020.08.25 |
---|---|
[BAEKJOON] 11049번 : 행렬 곱셈 순서* (0) | 2020.08.24 |
[BAEKJOON] 2293번 : 동전 1 (0) | 2020.08.23 |
[BAEKJOON] 1655번 : 가운데를 말해요 (0) | 2020.08.21 |
[BAEKJOON] 11286번 : 절댓값 힙 (0) | 2020.08.20 |