:: ADVANCE ::

[BaekJoon][7579] 앱 본문

Algorithm/DP (동적계획법)

[BaekJoon][7579] 앱

KSJ14 2016. 6. 25. 03:56
반응형

BAEKJOON ONLINE JUDGE


7579 앱


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



DP!


최소의 비용

문제의 핵심은 입력 메모리 값을 적절히 조합하여 합이 필요한 메모리 M 이상을 만드는데, 그 중 cost가 가장 작은 값을 출력하는 것이다.

단순히 완전히 탐색을 하여 메모리 조합을 찾는 경우에는 당연히 Time Limit가 발생한다.

따라서 DP로 문제를 풀어야 하는데

처음에는 dp[메모리] = cost(최소값) 로 생각을 하여

dp의 index(memory)가 입력 기준을 처음으로 넘는 cost를 출력하려 하였으나 메모리 범위가 넓어 배열을 잡을 수 없다.


---> 반대로!!

index와 값을 반대로 하여 보자

dp[cost] = memory(최대값)


입력 메모리와 cost를 입력순으로 저장해 놓고

그 순서대로 cost와 메모리를 더해나간다.

즉 첫 번째, 앱을 선택한다, 안한다로 결정할 경우 cost는 0과 3.

--> dp[0] = 0, dp[3] = 30이 저장된다.

두번째, 두번째 앱을 더하거나, 안더하는 경우 cost는 이전에 값이 결정된 0과 3에서 

첫번째 앱이 선택되지 않은 0에서 두번째 앱을 선택하지 않는 cost 0 -> 0과 선택하는 cost 0 -> 10 중 큰 값을 저장한다.

첫번째 앱이 선택된 3에서 두번째 앱을 선택하지 않는 경우 cost 3 -> 30, 선택할 경우 cost 3 -> 40 (이전 30 + 두번째 앱 메모리 10) 중에서 더 큰 값인 40을 저장한다.

이런 식으로 계산을 해 나가 마지막 앱까지 선택을 마친다면 모든 부분 집합의 cost별 최대 memory를 저장 할 수 있다.

이 중 cost를 다시 돌면서 dp에 저장된 비용 별 최대 memory 값 중 필요한 메모리를 처음으로 넘을 때의 cost를 출력하면 된다.


문제는 맞았지만 code를 최적화 하지 않아서 dp를 만드는 부분과 찾는 부분이 나누어져 있는데, 생각해보면 합쳐서 한번에 구현할 수 있을 것 같기도 하다.



반응형

'Algorithm > DP (동적계획법)' 카테고리의 다른 글

[BaekJoon][1328] 고층 빌딩  (0) 2016.07.04
[BaekJoon][2531] 회전 초밥  (0) 2016.06.25
[BaekJoon][1915] 가장 큰 정사각형  (0) 2016.06.07
[BaekJoon][9095] 1, 2, 3 더하기  (0) 2016.04.11
[BaekJoon][1149] RGB거리  (0) 2016.04.11
Comments