songining
article thumbnail

이 λ¬Έμ œλŠ” μƒκ°ν•œ 것 보닀 μ–΄λ €μ› λ‹€.  DP둜 ν’€μ–΄μ•Όκ² λ‹€κ³  생각을 ν•˜κ³  μ§°λŠ”λ° λ°°μ—΄ 1μ—μ„œλΆ€ν„° μ‹œμž‘ν•˜λ‹ˆ λ‚ μ§œ 계산을 μ–΄λ–»κ²Œ ν•΄μ•Όν•  지 감이 μ•ˆμ™”λ‹€. 

κ·Έλž˜μ„œ μƒλ‹΄μž‘λŠ” μˆœμ„œλ₯Ό λ§ˆμ§€λ§‰λ‚ μ—μ„œλΆ€ν„° μ‹œμž‘ν•˜μ˜€λ‹€. 

일단 상담을 μž‘μ„μˆ˜ μ—†λŠ” λ‚ κ³Ό 상담을 μž‘μ„ 수 μžˆλŠ” λ‚ λ‘œ 쑰건을 λ‚˜λˆˆλ‹€. 

 

1. 상담을 작으면 퇴사일을 λ„˜κΈ°λŠ” 경우

DP[i] = DP[i+1] 전날에 μž‘μ€ 상담 가격 λŒ€μž…

2. 상담 μž‘μ„ 수 μžˆλŠ” 경우 

max(DP[i+1], DP[i+time[i]]+Price[i]) 전날에 μž‘μ€ 상담가격과 (μ˜€λŠ˜μƒλ‹΄κ°€κ²©+μƒλ‹΄μΌμ§€λ‚œν›„μ˜ 상담가격) 쀑 큰 κ°’ 

 

 

def main():
    n = int(input())
    max_price_list = [0 for _ in range(n + 2)]
    time_list = [0 for _ in range(n + 2)]
    price_list = [0 for _ in range(n + 2)]
    for day in range(1, n + 1):
        time, price = map(int, input().split())
        time_list[day] = time
        price_list[day] = price
        max_price_list[day] = price
    for day in range(n, 0, -1):
        if time_list[day] + day - 1 > n:  # μƒλ‹΄μž‘μœΌλ©΄ 퇴사일 λ„˜κΈΈ 경우
            max_price_list[day] = max_price_list[day + 1]
        else:
            max_price_list[day] = max(max_price_list[day + 1], price_list[day] + max_price_list[day + time_list[day]])
    print(max_price_list[1])


if __name__ == '__main__':
    main()