[BOJ] 14501 퇴사_DP
Date:
퇴사
내 풀이
- 방식 : DP, BFS
- 날짜를 하루씩 늘려가거나, 상담을 진행하여 이후 날짜로 이동
- DP를 퇴사하기 전 날짜수로 1차원 리스트
- DP에 날짜별 금액을 저장
- 해당 날짜의 금액과 DP에 저장되어 있는 금액 준 큰 값을 DP에 업데이트
📰code
from collections import deque
# 입력
n = int(input())
schdl = []
for _ in range(n):
schdl.append(list(map(int,input().split())))
schdl.append([0,0])
# 초기 설정
dp = [-1]*(n+1)
q = deque()
q.append((0,0))
answer = 0
# BFS
while q:
day,s = q.popleft()
if dp[day]>=s: # 기존 날짜까지 올 수 있는 가장 큰 비용으로 산출, 동일한 날짜에 비용이 적은 경우는 제외시킴
continue
else:
dp[day]=s # 큰 비용으로 Update
if day+1 < n: # 상담을 안하고 넘어가는 날
q.append((day+1,s))
if day+schdl[day][0] <= n: # 상담을 하는 날, 퇴사날까지 포함하여야 마지막 상담까지 받을 수 있음
q.append((day+schdl[day][0],s+schdl[day][1])) # 상담을 하면 상담한 날짜 동안 이동
answer = max(answer,s) # 가장 큰 비용으로 업데이트
print(answer)
다른 풀이
- 방식 : DP, Greedy
- 점화식을 활용하여 논리적으로 전계함
📰code
N = int(input())
time_price = [list(map(int, input().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N-1, -1, -1): # 뒤에서부터 마지막 날짜부터 금액들 더해감
if i + time_price[i][0] <= N: # 상담이 끝나는 시점이 N보다 작은 경우를 확인함
dp[i] = max(dp[i+1], time_price[i][1] + dp[i + time_price[i][0]]) # 받을 수 있는 경우를 greedy형식으로 풀어냄
else:
dp[i] = dp[i+1]
print(dp[0])
💡 수정 필요한 내용은 댓글이나 메일로 알려주시면 감사하겠습니다!💡
댓글