우노
[DP] 백준 15486번 “퇴사 2” Python 풀이 본문
문제 링크
풀이
예제 입력이 아래와 같다고 가정해봅시다.
1일 2일 3일 4일 5일 6일 7일 Ti 3 5 1 1 2 4 2 Pi 10 20 10 20 15 40 200
만약, 1일차에 상담을 진행한다면, 해당 상담은 3일동안 진행되며, 4일차부터 다시 상담을 진행할 수 있습니다.
따라서, 1일차에 상담을 진행할 경우의 최대 이익은,
‘1일 차의 상담 금액 + 4일부터의 최대 상담 금액’이 됩니다.
이러한 원리를 뒤쪽 날짜부터 적용함으로써 문제를 해결할 수 있습니다.
뒤쪽 날짜부터, 매 상담에 대하여 ‘현재 상담 일자의 이윤(p[i]) + 현재 상담을 마친 일자부터의 최대 이윤(dp[t[i] + i]])’을 계산하면 됩니다.
이후, 계산된 값들 중 최댓값을 출력하면 됩니다.
dp[i]가 ‘i번째 날부터 마지막 날까지 낼 수 있는 최대 이익’이라고 한다면, 점화식은 아래와 같습니다.
dp[i] = max(p[i] + dp[t[i] + i], max_value)
- 이때 max_value는, ‘i번째 날부터 마지막 날까지 낼 수 있는 최대 이익’을 의미하게 됩니다.
결과적으로, 예제 입력에 따른 DP 테이블은 아래와 같이 완성됩니다.
- [45, 45, 45, 35, 15, 0, 0, 0]
코드
import sys
n = int(sys.stdin.readline())
t = [] # 각 상담을 완료하는데 걸리는 기간
p = [] # 각 상담을 완료했을 때 받을 수 있는 금액
# i번째 날부터 마지막 날까지 낼 수 있는 최대 이익
dp = [0] * (n+1)
for _ in range(n):
# 날짜별 상담 완료 기간 및 상담 완료 금액 저장
x, y = map(int, sys.stdin.readline().split(" "))
t.append(x)
p.append(y)
# i번째 날부터 마지막 날까지 낼 수 있는 최대 이익
max_value = 0
# 마지막 날짜부터 역순으로 탐색
for i in range(n-1, -1, -1):
# 해당 날짜에 상담을 진행할 수 있다면
if (i + t[i] <= n):
# [현재 상담 일자의 이윤 + 현재 상담을 마친 일자부터의 최대 이윤]과
# 현재 날짜부터 마지막 날까지 낼 수 있는 최대 금액을 비교
dp[i] = max(p[i] + dp[i + t[i]], max_value)
max_value = dp[i]
# 해당 날짜에 상담을 진행할 수 없다면
else:
dp[i] = max_value
print(max_value)
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[DP] 백준 2240번 “자두나무” Python 풀이 (0) | 2022.11.21 |
---|---|
[DP] 백준 10844번 “쉬운 계단 수” Python 풀이 (0) | 2022.11.20 |
[DP] 백준 11053번 “가장 긴 증가하는 부분 수열” Python 풀이 (0) | 2022.11.19 |
[DP] 백준 11055번 “가장 큰 증가 부분 수열” Python 풀이 (0) | 2022.11.19 |
[DP] 백준 1912번 “연속합” Python 풀이 (0) | 2022.11.15 |
Comments