14501-s3 성공
This commit is contained in:
40
workbook_7319/silver/14501-s3.py
Normal file
40
workbook_7319/silver/14501-s3.py
Normal 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]])로
|
||||
오늘 상담을 했을 경우 끝나는 미래 시점의 값에 오늘 상담 값을 더한 것과 그냥 오늘 상담을 안했을 때 값을 비교하여 최대값을 계산한다.
|
||||
"""
|
||||
Reference in New Issue
Block a user