728x90
https://www.acmicpc.net/problem/11066
다음 DP 테이블을 세운다.
dp[i][j] := i번째부터 j번째 파일까지 합치는 최소 비용
4중 반복문으로 i번째 책을 시작으로 j + 1개의 연속된 책을 합치려고 하는데 pivot이 m번째 책일 때 양 옆의 책들을 합치는 비용을 계산하면서 테이블을 채우는 방법을 생각할 수 있다.
다만 연속된 책을 합치는 과정을 반복문마다 수행하면 시간 초과를 받을 위험이 있다. 누적합으로 파일을 합치는 비용을 미리 계산하면 일부 연속된 책을 합치는 비용을 $O(1)$의 시간 복잡도로 처리할 수 있으므로 3중 반복문으로 줄어든다.
주어지는 TC에 대해 3중 반복문으로 테이블을 채운 후 최소 비용을 출력하면 정답을 받을 수 있다.
전체 코드
더보기
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int book[501][501];
int partialmin[501];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
while(n--)
{
int t;
cin >> t;
vector<int> cost(t + 1);
for (int x = 1; x <= t; ++x)
{
cin >> cost[x];
partialmin[x] = partialmin[x - 1] + cost[x];
}
for (int i = 1; i < t; ++i)
{
for (int j = 1; j + i <= t; ++j)
{
int liner = j + i;
book[j][liner] = 1e9 + 7;
for (int m = j; m < liner; ++m)
{
book[j][liner] = min(
book[j][liner],
book[j][m] + book[m + 1][liner] + partialmin[liner] - partialmin[j - 1]
);
}
}
}
cout << book[1][t] << '\n';
}
}
728x90
'백준 > DP' 카테고리의 다른 글
[KOI] 백준 2673 - 교차하지 않는 원의 현들의 최대집합 (0) | 2022.05.28 |
---|---|
백준 1937 - 욕심쟁이 판다 (0) | 2021.11.08 |
[KOI] 백준 2616 - 소형기관차 (0) | 2021.11.05 |
[KOI] 백준 2169 - 로봇 조종하기 (0) | 2021.08.21 |
백준 13555 - 증가하는 부분 수열 (0) | 2021.07.22 |