- 여기서 재귀호출은 DFS 의 문제해결 원리재귀호출을 이용해서 문제를 해결하는 도중 최적 부분 구조가 나타나면서 중복된 연산을 수행하게 될 때 중복된 부분을 제거하는 기법
import sys
import math
def topdown(day):
# 정확히 마지막 날의 경우
if day-1 == n:
return 0
# 퇴사일을 넘어가는 경우
elif day > n:
return -math.inf
if dp[day] != -1:
return dp[day]
# day를 기준으로 일을 하지 않고 바로 다음날로 가거나, 일을 하고 일한 날짜만큼 뒤로 가거나
dp[day] = max(topdown(day+1), topdown(day+T[day])+P[day])
return dp[day]
n = int(sys.stdin.readline())
T = [0]
P = [0]
dp = [-1] * (n+1)
for _ in range(n):
t,p = map(int,sys.stdin.readline().rstrip().split())
T.append(t)
P.append(p)
print(topdown(1))