https://www.acmicpc.net/problem/12864
문제
책의 번호가 나열된 길이 n의 실수 수열과 각 책을 옮기는데에 드는 비용이 주어진다.
나열된 책들을 번호가 오름차순이 되도록 책을 옮길 때, 최소 비용을 구해야한다.
(1<= n <= 5000)
접근
책을 옮기는 위치에 관계 없이 항상 옮기는 비용이 일정하다면, 최대한 비용이 작은 책들을 옮기는 것이 좋을 것이다.
이를 반대로 생각하면 우리는 비용의 합이 가장 큰 증가하는 부분수열을 구한 후, 전체 비용합에서 이를 제외해주면
책을 정렬하는데 드는 최소 비용을 구할 수 있을 것이다.
전체코드
#include <bits/stdc++.h>
using namespace std;
int dp[5050], cost[5050], ans, sum, N;
double arr[5050];
int main() {
cin >> N;
for(int i = 1; i <= N; i++) {
cin >> arr[i];
}
for(int i = 1; i <= N; i++) {
cin >> cost[i];
sum += cost[i];
}
for(int i = 1; i <= N; i++) {
dp[i] = cost[i];
for(int j = 1; j <= i-1; j++) {
if(arr[j] <= arr[i]) {
dp[i] = max(dp[i], cost[i] + dp[j]);
}
}
ans = max(dp[i], ans);
}
cout << sum - ans;
}
이런식으로 발상의 전환이 필요한 문제도 많이 풀어봐야겠다.
'알고리즘' 카테고리의 다른 글
| Boj 5626 c++ 제단 (1) | 2026.04.12 |
|---|---|
| Boj 33579 디미그래프 c++ (0) | 2026.04.12 |
| Boj 10451 c++ 순열 사이클 (0) | 2026.04.12 |
| 32073 c++ XOR 최대 (1) | 2026.04.05 |
| 3/23 ~ 3/30 PS 기록 (0) | 2026.03.30 |