Algorithm
[Swift 백준] 1535 안녕
Kim Roks
2025. 2. 5. 21:42
풀이 아이디어
dp로 풀이했습니다.
점화식을 적으려다보니 너무 가독성이 떨어져서
자세한 설명은 코드에 적어놓겠습니다
풀이
let n = Int(readLine()!)!
let minusHP = readLine()!.split(separator: " ").map { Int($0)! } // 체력 소모량
let plustHappy = readLine()!.split(separator: " ").map { Int($0)! } // 기쁨 증가량
var dp = [Int](repeating: 0, count: 101)
for i in 0..<n {
let hp = minusHP[i]
let happpy = plustHappy[i]
// 체력이 100부터 현재 health까지 역순으로 탐색
for j in stride(from: 100, through: hp, by: -1) {
dp[j] = max(dp[j], dp[j - hp] + happpy)
}
/*
stride(from: 100, through: hp, by: -1):
체력 j는 100에서부터 해당 아이템의 체력 소모량 hp까지 역순으로 탐색.
역순인 이유는, 한 번의 탐색에서 현재 상태를 갱신하면서 다른 상태에 영향을 미치지 않도록 하기 위함.
*/
/*
점화식
체력이 j일 때의 최대 기쁨을 구함. 두 가지를 비교:
dp[j]: 현재 체력 j에서 얻을 수 있는 기쁨
dp[j - hp] + happy: 인사를 했을 경우, 이전 체력 j - hp에서 얻을 수 있는 최대 기쁨에 기쁨 증가량 happy를 더한 값.
*/
}
// 체력을 99까지 쓸 수 있을때의 결과 출력
print(dp[99])