#문제
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
#풀이 & 학습한 내용
시작과 종료일이 있고, 각각의 수익이 다른 상담들 중에서 총 수익을 최대화하는 문제입니다. 종료일 기준으로 오름차순 정렬한 후에, dp[k]를 "k일까지의 최대이익"으로 정의하여 dp리스트를 앞에서부터 채워나갑니다. 그리고 dp[N]이 N일까지의 최대이익이므로 정답으로 출력합니다.
#소스코드
N=int(input())
consults=[] #상담들 저장하는 리스트
dp=[0]*(N+1) #★dp[k]: k일까지의 최대이익
for i in range(N):
one_consult=[i+1]+list(map(int,input().split()))
one_consult[1]=one_consult[0]+one_consult[1]-1
if one_consult[1]<=N:
consults.append(one_consult)
#[시작일, 종료일, 수익]으로 리스트에 모두 넣어줌
consults.sort(key=lambda x:x[1]) #종료일 기준 오름차순 정렬
temp=0
for consult in consults:
for j in range(temp+1,consult[1]): #dp의 중간에 비워진 부분을 채워주기 위해
dp[j]=dp[j-1]
dp[consult[1]]=max(dp[consult[1]], dp[consult[1]-1], dp[consult[0]-1]+consult[2])
temp=consult[1]
if temp!=N: #N일차까지 dp가 채워지지 않고 끝났을 때
for j in range(temp+1,N+1):
dp[j]=dp[j-1]
print(dp[N])
github.com/HoYoungChun/Algorithm_PS/blob/master/Dynamic_Programming/BOJ_14501.py
HoYoungChun/Algorithm_PS
Baekjoon Online Judge, Programmers problem solving by Python, C++ - HoYoungChun/Algorithm_PS
github.com
'Algorithm > Dynamic Programming' 카테고리의 다른 글
| [C++] 백준 2133번 : 타일 채우기 (S2) (0) | 2020.11.18 |
|---|---|
| [C++] 백준 17404번 : RGB거리 2 (G4) (0) | 2020.11.18 |
| [C++] 백준 13398번 : 연속합 2 (G5) (0) | 2020.11.18 |
| [C++] 백준 11054번 : 가장 긴 바이토닉 부분 수열 (G3) (0) | 2020.11.18 |
| [C++] 백준 11055번 : 가장 큰 증가 부분 수열 (S2) (0) | 2020.11.15 |