-
백준 7579 앱Algorithm/BOJ 2021. 6. 2. 13:37728x90
출처: https://www.acmicpc.net/problem/7579
분류: DP
접근방식
어떤 걸 기준으로 DP를 만들건지 어려웠던 문제였습니다...
결국 다른 블로그의 풀이를 참고하여 해결했습니다.
비용으로 확보할 수 있는 최대 메모리를 만들어가는 방식으로 해결했습니다.
점화식은 아래와 같습니다.
DP[cost] = max( DP[cost] , DP[cost - inActiveCost[app] + activeMemory[app] )
여기서 DP[cost]는 cost를 사용하여 확보할 수 있는 최대 메모리인데요,
DP[ cost - inActiveCost[app] ] 은 app을 아직 제거하기 전의 비용으로 확보할 수 있는 최대 메모리로
여기에 지금 앱을 제거해서 얻을 수 있는 비용을 더해주면 이게 현재 앱을 제거시켜서 확보할 수 있는 메모리가 되는거죠 :)이걸 cost 0부터 전체 비용(모든 앱을 제거했을 때) - 현재 앱 제거비용 까지 DP를 업데이트 시켜주면 됩니다.
단, 0부터 시작하면 다음 계산에서 이번에 업데이트 한 결과가 반영되기 때문에 역순으로 갱신해줬습니다.참고
https://life-with-coding.tistory.com/316
해결방법
let nm = readLine()!.split(separator: " ").map { Int(String($0))! } let (n, m) = (nm[0], nm[1]) let activeMemory = readLine()!.split(separator: " ").map { Int(String($0))! } let inActiveCost = readLine()!.split(separator: " ").map { Int(String($0))! } let maxCost = inActiveCost.reduce(0, +) var dp = [Int](repeating: 0, count: maxCost+1) for app in 0..<n { for cost in (inActiveCost[app]...maxCost).reversed() { dp[cost] = max(dp[cost], dp[cost-inActiveCost[app]] + activeMemory[app]) } } for cost in 0...maxCost { if dp[cost] >= m { print(cost) break } }
배운점
하 이번도 쉽지 않았다....
'Algorithm > BOJ' 카테고리의 다른 글
백준 2056 작업 (0) 2021.06.03 백준 2169 로봇 조종하기 (0) 2021.06.02 백준 5557 1학년 (0) 2021.06.02 백준 1013 Contact (0) 2021.05.23 백준 13397 구간 나누기 2 (0) 2021.05.21