문제: 퇴사 2 (백준 15486번)
문제 분석
- 입력:
일 동안 상담을 진행할 수 있으며,
각 상담은 걸리는 기간 와 얻을 수 있는 금액 를 가진다. - 목표: 상담을 적절히 선택하여 얻을 수 있는 최대 수익을 계산하는 문제.
- 조건: 상담이 끝나는 날을 초과하면 진행할 수 없다.
해결 방법: 동적 계획법 (DP)
이 문제는 배낭 문제 (Knapsack Problem)와 유사하다.
각 날짜별로 상담을 선택할지 말지를 결정해야 하며, 최적의 선택을 누적하면서 해결해야 한다.
DP 테이블 정의
- dp[i]: i번째 날까지 얻을 수 있는 최대 수익
- 즉, i일이 끝났을 때 가능한 최대 이익을 저장한다.
점화식
- 현재까지의 최대 수익 유지
- i번째 날까지의 최대 수익은 이전 날까지의 최대 수익과 비교하여 갱신된다.
- 즉, 오늘 상담을 하지 않더라도 이전 날까지의 최대 수익은 유지되어야 한다.
- i일에 상담을 선택하는 경우
- 상담을 하면
일 후(즉, )에 보상이 지급되므로, 가 을 초과하면 상담을 할 수 없다.
- 상담을 하면
코드 설명
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n; cin >> n;
vector<pair<int, int>> v(n);
vector<int> dp(n + 1);
// 상담 일정 입력
for (int i = 0; i < n; i++)
{
cin >> v[i].first >> v[i].second; // {T_i, P_i}
}
// DP 수행
for (int i = 0; i < n; i++)
{
// i일까지의 최대 수익 유지
if (i > 0) dp[i] = max(dp[i], dp[i - 1]);
int index = i + v[i].first; // 상담이 끝나는 날짜
if (index <= n) // 퇴사일을 넘지 않으면 상담 가능
{
dp[index] = max(dp[index], dp[i] + v[i].second);
}
}
// 최댓값 출력
cout << *max_element(dp.begin(), dp.end());
}
'C++' 카테고리의 다른 글
[C++] 텍스트 기반 RPG 게임 제작 프로젝트 회고록 (0) | 2025.01.17 |
---|---|
[OPEN GL] 프로젝트 시작 전 사용 설정 (0) | 2021.12.05 |
[Open GL] v/vt/vn 형식 OBJ 읽어오기 (0) | 2021.12.05 |
Laplace equation in c++ (0) | 2021.10.08 |
Mesh smoothing with cotangent weight (1) | 2021.10.08 |