[BaekJoon 15486 : 동적계획법, Python] - 퇴사 2

2021, Oct 29    


백준 15486 퇴사 2 : 실버 1



Solution


DP Memoization 활용(Bottom-up)


import sys
input = sys.stdin.readline

consult = {}
n = int(input())
for i in range(n):
    consult[i] = list(map(int, input().split()))

dp = [0]*(n+1)

for i in range(0, n):
    if i + consult[i][0] <= n:
        dp[i + consult[i][0]] = max(dp[i + consult[i][0]], dp[i] + consult[i][1])       # i 번째 날의 최대 이익

    dp[i+1] = max(dp[i+1], dp[i])       # 한 번도 if 문 타지못한 끝 쪽의 날짜들을 위한 코드

print(dp[n])


풀이과정 및 느낀점


이전 포스팅인 14501 퇴사 1 문제의 상위 문제이다.
14501 의 경우 1 ≤ N ≤ 15 범위의 테스트케이스가 주어지는 반면, 이번 15486 버전은 1 ≤ N ≤ 1,500,000 범위의 케이스가 주어진다.
시간 제한은 2초로 동일한 걸 고려하면 이번 문제가 시간적으로 훨씬 엄격하다.
당연히 14501 방식(for 문 2번 돌림)을 그대로 제출하면 시간초과가 나기 때문에, for 문을 1번으로 줄여야 했다. (다른 분들의 코드를 참고해서…)