반응형

https://www.acmicpc.net/problem/15486

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

해결 방법 : DP

  • i일차에 주어진 상담 기간 T, 상담 비용 P에 대해, dp[i + T]를 갱신해주면 된다.
    • 점화식 : dp[i + T] = max(dp[i + T], dp[i] + P)
      • i + T 가 퇴사 이전인 경우에만 갱신한다.
  • i일차의 최고 수입은 현재까지의 최고 수입이므로, 동기화 작업이 필요하다.
    • dp[i] = max(dp[i], dp[i-1])
import sys
input = sys.stdin.readline

def solution(N, arr):
    dp = [0] * (N + 1)
    
    for i, TP in enumerate(arr):
        T, P = TP # 상담 기간, 비용
        dp[i] = max(dp[i], dp[i-1]) # 현재까지 최고 수입으로 동기화
        if i + T <=  N: # 상담 가능 
            dp[i + T] = max(dp[i + T], dp[i] + P) # 점화식

    return max(dp[N-1], dp[N])

if __name__ == '__main__':
    N = int(input())
    arr = [tuple(map(int, input().split())) for _ in range(N)]
    result = solution(N, arr)
    print(result)
반응형

+ Recent posts