Algorithm/Baekjoon
[λ°±μ€] (Swift) 9465λ² - μ€ν°μ»€ (dp νμ΄)
κ°μ π₯
2022. 3. 25. 00:29
λ°μν
λ¬Έμ λ§ν¬
https://www.acmicpc.net/problem/9465
9465λ²: μ€ν°μ»€
첫째 μ€μ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ° ν μ€νΈ μΌμ΄μ€μ 첫째 μ€μλ n (1 ≤ n ≤ 100,000)μ΄ μ£Όμ΄μ§λ€. λ€μ λ μ€μλ nκ°μ μ μκ° μ£Όμ΄μ§λ©°, κ° μ μλ κ·Έ μμΉμ ν΄λΉνλ μ€ν°μ»€μ
www.acmicpc.net
νμ΄ IDEA
μ΄λ κ² λ°κ²¬ν μ νμμ μλμ κ°λ€. μ¬κΈ°μ dp λ μμ κ·Έλ¦ΌμΌλ‘ λνλΈ μ΅λκ°λ€μ μ μ₯νλ λ°°μ΄μ΄κ³ , arr λ μ°λ¦¬κ° μ λ ₯λ°μ μ€ν°μ»€λ€μ κ°κ²©μ΄ λͺ μλμ΄μλ λ°°μ΄μ΄λ€.
dp[0][i] = max(dp[1][i-1] + arr[0][i], dp[1][i-2] + arr[0][i])
dp[1][i] = max(dp[0][i-1] + arr[1][i], dp[0][i-2] + arr[1][i])
ν΄λΉ μ νμμ νμ©νμ¬ λ¬Έμ λ₯Ό νλ©΄ λλ€.
μμ€μ½λ - λ§μμ΅λλ€!
- λλ sticker λΌλ ν¨μλ₯Ό ν΅ν΄ dp λ₯Ό ꡬμ±νλ€.
- κ·Έλ¦¬κ³ for λ¬Έμ μ΄μ©ν΄μ μ€ν°μ»€λ€μ λ°°μ΄μ μ λ ₯λ°μλ€.
let count = Int(readLine()!)!
for _ in 1...count {
let n = Int(readLine()!)!
var arr: [Array<Int>] = []
for _ in 0...1 {
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
arr.append(input)
}
let result = sticker(n: n, arr: arr)
if n == 1 {
print(max(result[0][0], result[1][0]))
} else if n == 2 {
print(max(result[0][1], result[1][1]))
} else {
print(max(result[0][n-1], result[1][n-1]))
}
}
func sticker(n: Int, arr: Array<Array<Int>>) -> Array<Array<Int>> {
var dp = Array(repeating: Array(repeating: 0, count: n), count: 2)
dp[0][0] = arr[0][0]
dp[1][0] = arr[1][0]
if n > 1 {
dp[0][1] = arr[1][0] + arr[0][1]
dp[1][1] = arr[0][0] + arr[1][1]
for i in 2..<n {
dp[0][i] = max(dp[1][i-1] + arr[0][i], dp[1][i-2] + arr[0][i])
dp[1][i] = max(dp[0][i-1] + arr[1][i], dp[0][i-2] + arr[1][i])
}
}
return dp
}
λ°μν