-
https://www.acmicpc.net/problem/14728
14728번: 벼락치기
ChAOS(Chung-ang Algorithm Organization and Study) 회장이 되어 일이 많아진 준석이는 시험기간에도 일 때문에 공부를 하지 못하다가 시험 전 날이 되어버리고 말았다. 다행히도 친절하신 교수님께서 아래와
www.acmicpc.net
해당 문제는 단원 수와 공부할 수 있는 시간이 주워지고
각 단원별 공부시간과 점수가 주어졌을 때
공부할 수 있는 시간 안에서 공부할 수 있는 최대 점수를 구하는 문제다.
딱 전형적인 냅색 문제였다.
해당 문제는 dp를 이용해서 해결했으며, 뒤에서부터 체크하는 방식으로 1차원 배열로 해결했다.
처음 입력 처리를 해준 뒤, 단원 수만큼 반복을 돌고 그 안에 공부할 수 있는 시간만큼 반복을 도는데
공부할 수 있는 시간은 끝에서부터 감소하도록 한다.
먼저 현재 시간에서 해당 단원의 공부시간을 뺸 것이 0보다 크거나 같다면
공부를 할 수 있기 때문에 비교를 해주는데
점화식은 dp[j] = Math.max(dp[j], S[i] + dp[j-K[i]]) 이 되는데
지금 dp[j]는 이전 단원에서의 해당 시간에 최댓값이 저장되어 있고,
S[i] + dp[j-K[i]]는 현재 단원의 점수 + 현재 시간에서 현재 단원의 공부 시간을 뺏을 때
이전 단원에서의 최댓값 합이 된다.
두 값은 비교해서 큰값을 dp 배열에 넣어주는 방식으로 문제를 해결했다.
주어지는 테케에서 예를 들면
첫 단원을 다 돌고 나면 dp 배열의 0~49는 0, 50~310은 40이 들어가게 되고
두 번째 단원을 돌고 나면 0~49는 0, 50~99까지는 40, 100~ 149는 70, 150~310은 110이 들어오게 된다.
728x90'알고리즘 > Baekjoon' 카테고리의 다른 글
Baekjoon 1655 가운데를 말해요 JAVA (0) 2021.11.17 Baekjoon 2660 회장뽑기 JAVA (0) 2021.11.17 Baekjoon 3055 탈출 JAVA (0) 2021.11.17 Baekjoon 13459 구슬 탈출 JAVA (0) 2021.11.17 Baekjoon 2573 빙산 JAVA (0) 2021.11.17 댓글