[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번으로 줄여야 했다. (다른 분들의 코드를 참고해서…)