14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net


나의 풀이

  • 오랜만에 푸는 DP 문제이다. 고민하다가 못 풀어서 결국 풀이를 참고했다.
  • 각 날짜 별 최대 이윤을 DP 테이블로 구성하고, 최대 이윤 값을 얻을 땐 뒤쪽 날짜부터 거꾸로 진행해서 계산해야 한다.
  • 이렇게 되면 DP[i] = max(현재 상담 일자의 최대 이윤 + 현재 상담이 끝난 후를 기준으로 한 최대 이윤, 기존 최댓값)으로 표현이 가능하다. 
n = int(input()) # 전체 상담 개수
t_list = [] # 상담 완료까지 기간
p_list = [] # 상담 완료 시 받을 수 있는 금액

dp = [0] * (n + 1)
max_value = 0

for _ in range(n):
    t, p = map(int, input().split())
    # 원소 추가
    t_list.append(t)
    p_list.append(p)

# DP 테이블 작성
for i in range(n - 1, -1, -1):
    time = t_list[i] + i
    # 상담이 기간 안에 끝나는 경우
    if time <= n:
        dp[i] = max(p_list[i] + dp[time], max_value)
        max_value = dp[i]
    # 상담이 기간을 벗어나는 경우
    else:
        dp[i] = max_value

print(max_value)

참고

이것이 취업을 위한 코딩 테스트다 with 파이썬