n일 수익을 최대화 하려고 한다.
각 작업은 수행 완료하는데 걸리는 기한 t와 이를 완료 했을 때의 수익 p가 주어진다.
두 개 이상의 작업은 동시에 수행할 수 없으며, 휴가 기간(n+1일) 이후로는 일을 할 수 없다고 할 때 외주 수익의 최대값을 출력하는 프로그램.
백준 # 14501 퇴사 문제이다.
일을 수행할 경우와 수행하지 않을 경우로 나누어 생각해야 한다.
해당 값을 비교하여 더 큰 값을 dp에 저장한다.
그러나 소요 시간이 휴가 일수를 넘어가면, 아예 선택할 수가 없으므로 dp[i+1]을 dp에 넣는다.
top-down 방식으로 내려오면서 배열의 첫 번째에 가장 큰 원소가 저장된다. 해당 값을 출력해주면 된다.
n = int(input())
dp = [0 for _ in range(n+1)]
arr = [list(map(int, input().split())) for _ in range(n)]
for i in range(n-1, -1, -1):
if i + arr[i][0] <= n:
dp[i] = max(dp[i+arr[i][0]] + arr[i][1], dp[i+1])
else:
dp[i] = dp[i+1]
print(dp[0])