본문 바로가기
백준

[14501] 퇴사

by kmyobin 2023. 4. 5.


https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

Dynamic Programming 문제이다.

사실 잘 몰라서 구글의 힘을 빌렸다. 오랫동안 안하다보니 머리가 굳은 것 같다ㅠㅠ

 

A[i]를 i일에 받는 최대의 금액이라고 정의한다.

또한 받는 돈은 업무가 끝난 후 다음날에 들어온다고 가정한다.

 

1) i번째 날에 일한 경우

퇴사날을 넘기면 안되므로 조건문을 만든다. 

i+T[i]<=N+1이라면 퇴사날을 넘기는 것이 아니므로 ok!

 

2) i번째 날에 일하지 않은 경우

이는 간단하게 A[i+1]과 A[i]을 비교하여 더 큰 값을 넣는다.

 

#include <iostream>
#include <cmath>
using namespace std;

int N;
int T[17]; int P[17];
int A[17];
/*
	A[i] = i일까지 얻는 이익
*/
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;

	for (int i = 1; i <= N; i++)
	{
		cin >> T[i] >> P[i];
	}

	// 그 다음날에 돈이 들어온다고 가정
	for (int i = 1; i <= N ; i++) {
		// i번째 날에 일 했을 경우
		if (i + T[i] <= N + 1) {
			// 퇴사 전 날까지만 일해야 함
			A[i + T[i]] = max(A[i + T[i]], A[i] + P[i]);
		}
				// i번째 날에 일을 하지 않았을 경우
		A[i + 1] = max(A[i + 1], A[i]);
	}

	cout << A[N + 1];
}

'백준' 카테고리의 다른 글

[14503] 로봇 청소기  (0) 2023.04.07
[13458] 시험 감독  (0) 2023.04.06
[11444] 피보나치 수 6  (0) 2023.02.08
[10830] 행렬 곱셈  (0) 2023.02.08
[1629] 곱셈  (0) 2023.02.06

댓글