문제 설명
https://www.acmicpc.net/problem/14501
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
해결 방법
dp문제 이다.
schedule[i][0] i번째 상담의 기간(T)
schedule[i][1] i번째 상담의 금액(P)
dp(21,0) N의 최댓값이 15이고 T의 최댓값이 5이므로.
N-1번째 날 부터 0번째 날까지 거꾸로 확인했다.
if (i + schedule[i][0] > n) { dp[i] = dp[i + 1]; } 퇴사일을 넘어서 상담을 하지 못하는 경우
else
{
acceptCase = dp[i + schedule[i][0]] + schedule[i][1];
i번째 일을 수락할 경우 이익 = i번째 일이 끝난 후 하는 일의 금액 + i번째 일의 금액
denyCase = dp[i + 1];
i번째 일을 거절할 경우 이익 = i+1번째 일을 수락할 경우의 이익
dp[i] = max(acceptCase, denyCase);
둘 중 더 높은 금액을 선택
}
#include<iostream>
#include<vector>
using namespace std;
#define MAX 21
int main()
{
//INPUT==============================================
int n; cin >> n;
vector<vector<int>> schedule(n, (vector <int>(2)));
vector<int> dp(MAX,0);
for (int i = 0; i < n; i++)
{ cin >> schedule[i][0] >> schedule[i][1]; }
//SEARCH=============================================
int acceptCase; //i번째 일을 수락했을 때 이익
int denyCase; //i번째 일을 거부했을 때 이익
for (int i = n-1; i >= 0; i--)
{
if (i + schedule[i][0] > n)
{ dp[i] = dp[i + 1]; }
else
{
acceptCase = dp[i + schedule[i][0]] + schedule[i][1];
denyCase = dp[i + 1];
dp[i] = max(acceptCase, denyCase);
}
}
cout << dp[0];
}
'개발 > 백준' 카테고리의 다른 글
[백준] 13417번. 카드 문자열 (C++) (1) | 2024.01.06 |
---|---|
[백준] 12018번. Yonsei TOTO (C++) (1) | 2024.01.06 |
[백준] 1932번. 정수 삼각형 (C++) (1) | 2024.01.02 |
[백준] 1149번. RGB거리 (C++) (0) | 2024.01.02 |
[백준] 1003번. 피보나치 함수 (C++) (0) | 2023.12.27 |