다이나믹 프로그래밍 문제이다.
1일 ~ N일까지 각각 상담이 1개씩 잡혀 있으며, 각 상담은 상담에 걸리는 날짜와 수익이 다르다.
N일까지의 상담을 적절하게 맡아서 최대 수익을 얻어야 하는 문제이다.
이 문제는 작은 일수부터 최댓값을 구해나가서 N일까지의 최댓값에 도달하면 된다. 즉,
1일까지의 최댓값
2일까지의 최댓값
....
N일까지의 최댓값
이런 식으로 DP를 구현하면 된다.
날짜는 1일부터 있으므로 time, point, dp테이블을 N + 1 크기로 만들고 반복문을 1부터 시작한다.
dp테이블엔 i일 까지의 최대 수익이 각각 저장된다.
반복문이 시작되는 i일의 최대 수익은, "max(dp[i], dp[i - 1])" 으로 설정한다. dp[i]값은 아래쪽 finDate에 의해서 이미 저장되었을 수 있기 때문에 가능하다.
상담이 끝나는 날을 구하는 식은
"i + time[i] - 1" 이다. 이러면 해당 날짜의 상담이 끝나는 날이 구해지며 이것은 finDate에 저장된다. 해당 날짜 상담의 수익을 전날의 수익에 더해서, dp[finDate]에 넣어주면 된다. 물론 기존 값보다 클 경우이다. 따라서 식은,
"dp[finDate] = max(dp[finDate], dp[i - 1] + point[i])" 이다.
이렇게 반복문을 돌며 dp[i] 값과 dp[finDate] 값을 계속 갱신해 주는데, 항상 max함수를 사용해 더 큰 값을 저장하므로 dp 테이블엔 항상 최댓값이 저장되게 된다. 앞의 날짜까지의 최댓값을 이용해 오늘의 최댓값을 구하므로 dp형식에 들어맞는다.
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Baekjoon 11055 / Python / 실버2] 가장 큰 증가하는 부분 수열 (0) | 2024.08.22 |
---|---|
[Baekjoon 11053 / Python / 실버2] 가장 긴 증가하는 부분 수열 (0) | 2024.08.22 |
[Baekjoon 12865 / python / 골드5] 평범한 배낭 (0) | 2024.04.07 |
[Baekjoon 9251 / python / 골드5] LCS (0) | 2024.04.07 |
[Baekjoon 9084 / python / 골드5] 동전 (0) | 2024.04.06 |