14501-s3 성공

This commit is contained in:
sm4640
2026-03-26 17:54:29 +09:00
parent 159c3878a6
commit e84f83b0b7

View File

@@ -0,0 +1,40 @@
# 퇴사
import sys
input = sys.stdin.readline
def solution():
n = int(input().rstrip())
t_p = [(0, 0)] + [tuple(map(int, input().rstrip().split())) for _ in range(n)] + [(0, 0)]
dp = [0] * (n+2)
for i in range(1, n+2):
dp[i] = t_p[i][1]
for j in range(i-1, 0, -1):
if j+t_p[j][0] > i:
continue
dp[i] = max(dp[i], dp[j]+t_p[i][1])
print(dp[n+1])
return
solution()
"""
걸린 시간: 29분
시간 복잡도: 현재 보는 날짜에서 이전 날짜까지를 다 확인해보기 때문에 O(n^2)이다.
해설: 현재 보는 날짜로 올 수 있는 이전의 날짜들만 확인하고 싶었는데, set이나 dict에 계속 저장해놓고 갱신하는 것도 시간이 들기 때문에
그냥 이전 날짜를 다 보고 현재 날짜로 올 수 있는 날짜들만 계산을 했다.
근데 이걸 dp를 거꾸로 채우면 O(n)으로 가능하다.
현재 보는 날짜에 상담 여부를 결정하는데, 전제 조건은 현재 날짜에서 상담을 진행하면 퇴사날짜를 넘기지 않는 것이 조건이다.
만약 넘긴다면 그냥 dp[i+1]의 값을 가져와서 오늘은 상담을 안한 것으로 간주한다.
만약 퇴사 날짜를 넘기지 않는다면, max(dp[i+1], p[i]+dp[i+t[i]])로
오늘 상담을 했을 경우 끝나는 미래 시점의 값에 오늘 상담 값을 더한 것과 그냥 오늘 상담을 안했을 때 값을 비교하여 최대값을 계산한다.
"""