https://www.acmicpc.net/problem/15486
15486번: 퇴사 2
첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)
www.acmicpc.net

이 문제는 예전에 풀기도 했었고, 보자마자 DP가 떠올랐습니다. 상담으로 얻을 수 있는 최대 수익을 출력해야 하는데, 이전에 벌어들인 수익을 누적시켜야 하기 때문에 DP를 이용했습니다.
기본 로직은 상담을 하는 것과 하지 않는 것으로 나누고,
상담을 했을 때는 max(상담을 했을 때의 누적값, 그날 상담으로 얻을 수 있는 비용)이고,
상담을 하지 않은 경우에는 max(그 날 상담으로 얻을 수 있는 비용, 다음 날 상담으로 얻을 수 있는 비용)입니다.
<코드>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int d[1500001];
int t[1500001];
int p[1500001];
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> t[i] >> p[i];
}
for (int i = 0; i < n; i++)
{
d[i + t[i]] = max(d[i + t[i]], d[i] + p[i]);
// 상담 O
d[i + 1] = max(d[i + 1], d[i]);
// 상담 X
}
cout << d[n] << '\n
'PS > 동적 계획 알고리즘[DP]' 카테고리의 다른 글
백준 11066 파일 합치기(c++) (0) | 2023.01.27 |
---|---|
백준 10942 팰린드롬?(c++) (0) | 2023.01.27 |
백준 11048 이동하기(c++) (0) | 2023.01.26 |
백준 11660 구간 합 구하기 5(c++) (0) | 2023.01.19 |
백준 2775 부녀회장이 될테야(c++) (0) | 2023.01.19 |