수진개발서
Published 2023. 1. 9. 17:12
[baekjoon] 백준 15486 퇴사2 Algorithm

문제

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

풀이

  • 끝나는 날 기준으로 얻을 수 있는 금액을 입력 - 끝나는 날 기준이기때문에 N+1일까지 반복
  • 상담일자와 상담기간을 더했을 때 퇴사 일자를 넘어가면 continus
  • 이전의 저장된 k의 값과 dp[i] 중 비교하여 큰 것으로 갱신
  • dp[i] 는 현재까지의 수익 + 이번 상담 수익 vs 오늘의 상담이 끝나는 시점의 수익 중 큰 값 저장
T/P 1일 2일 3일 4일 5일 6일 7일 8일
3 / 10       10        
5 / 20           20    
1 / 10       10        
1 / 20         10+20      
2 / 15             10+20+15  
4 / 40               continue
2 / 200               continue

코드

# 상담 N일동안 최대한 많은 상담
# 상담 완료 기간 T/ 상담을 했을 때 받을 수 있는 금액 P
# 가치 구하기, 배낭문제와 같음
import sys 

n = int(sys.stdin.readline())
t, p = [], []
dp = [0] * (n+1)

for _ in range(n):
    ti, pi = map(int, sys.stdin.readline().split())
    t.append(ti)
    p.append(pi)

k = 0
for i in range(n):
    k = max(k, dp[i])
    if i + t[i] > n:
        continue
    dp[i + t[i]] = max(k + p[i], dp[i + t[i]])

print(max(dp))

'Algorithm' 카테고리의 다른 글

[programmers] 프로그래머스 등굣길  (0) 2023.01.09
[baekjoon] 백준 1520 내려막길  (0) 2023.01.09
profile

수진개발서

@sujin_park0607

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!