[λ°±μ€] (Swift) 14501λ² - ν΄μ¬ (λλ²μ§Έ νμ΄, DP)
π λ¬Έμ
https://www.acmicpc.net/problem/14501
14501λ²: ν΄μ¬
첫째 μ€μ λ°±μ€μ΄κ° μ»μ μ μλ μ΅λ μ΄μ΅μ μΆλ ₯νλ€.
www.acmicpc.net
π λ¬Έμ νμ΄
μ΄μ μ λ΄€λ λ¬Έμ μλκ² κΈ°μ΅λ¬λ€. λ¬Έμ λ λ± λ³΄μλ§μ dp μμ νμ ν μ μμλ€. λ΄κ° νμμ μ’μνλ dp μ νμ΄μλ€!
μ΄λ κ² νμ΄λ₯Ό μκ°ν΄λ΄κ³ , μλμ κ°μ μ½λλ₯Ό μμ±νλ€.
let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 21) // μ΅λ N -> 15μΌ, μλ΄ term μ΅λ 5μΌ
for i in 1..<n+1 {
if i+arr[i][0] > n {
continue
}
dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i])
}
print(dp.max()!)
μ΄λ κ² νΈλκΉ νλ Έλ€κ³ λ¨λ κ²μ΄λ€.... μμ§??
κ³°κ³°ν μκ°ν΄λ³΄λκΉ, μλμ κ°μ κ²½μ°λ₯Ό λλ νλ¨νμ§ μμλ€. 4μΌμ°¨μ μλ‘μ΄ μλ΄μ μ§ννμ§ μκ³ , μ΄μ μ κ°μ΄ μ μ§λλκ² λ ν° κ²½μ°λ₯Ό μκ°νμ§ μμλ κ²μ΄λ€.
μ΄λ° κ²½μ°κΉμ§ λͺ¨λ ν¬ν¨μμΌμ μ½λλ₯Ό μμ±ν΄μ£Όμ΄μΌνλ€. λ€μγ΄
let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 21) // μ΅λ N -> 15μΌ, μλ΄ term μ΅λ 5μΌ
for i in 1..<n+1 {
if i+arr[i][0] > n+1 {
continue
}
if dp[i] > dp[i+1] {
dp[i+1] = dp[i]
}
dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i+arr[i][0]])
}
print(dp.max()!)
μ΄λ κ² κ°μ΄λ° if λ¬Έμ μΆκ°ν΄μ£Όμλ€. λ΄μΌμ κΈμ‘μ΄ μ€λμ κΈμ‘λ³΄λ€ μμΌλ©΄, μ€λμ κΈμ‘μ κ·Έλλ‘ μ΄μ(?)ν΄μ κ°μ Έκ°λ©΄ λκΈ° λλ¬Έμ dp[i+1]μ dp[i]λ₯Ό λ£μ΄μ£Όμλ€.
μ¬κΈ°μ λ νλ Έλ€.... μ... λλ체 λ μ .. λκ°λ¬Έμ λ°... μμΈν μ΄ν΄λ³΄λκΉ, 첫λ²μ§Έ ifλ¬Έμ΄ λ¬Έμ μλ€. forλ¬Έμ μ§μ νμλ§μ ifλ₯Ό ν΅ν΄μ n+1μ΄ λμ΄κ°λμ§ νλ¨μ ν΄μ£Όκ³ , λμκ²½μ° continueν΄μ ν΄λΉ iλ₯Ό μ²λ¦¬νμ§ μλλ‘ ν΄μ€¬λ€. νμ§λ§, μ΄κ²μ λ§μ½ n+1μ λλλΌλ, dp[i]λ μ²λ¦¬ν μ μλλ‘ ν΄μ£Όμ΄μΌνλλ°, μ΄ λͺ¨λ κ³Όμ μ λ λ €λ¨ΉκΈ° λλ¬Έμ κ²°κ³Όκ°μ΄ λ€λ₯΄κ² λμ¬ μ λ°μ μλ€. κ·Έλμ if λ¬Έμ μμλ₯Ό λ°κΏμ€μΌ νλ€. (λ°κΎΈλκΉ μ λ΅μ΄λ€!)
π μ λ΅μ½λ
μ,, μ€κ°μ€κ° μΈλ±μ€ κ΄λ ¨ν΄μ μ€λ₯λ λ§μκ³ , μ΄κ²μ κ² ifλ¬Έμ λν΄μ μκ°νμ§ λͺ»ν λΆλΆ...μ΄ λ§μμ΄μ κ΅μ₯ν λ§μ΄ νλ Έλ€. γ γ γ γ γ ν... λλ²μ§Έ νμ΄μΈλ° μ€μΌ μ©μ©λ§€λκ±°μ§ νμ§λ§ κ·Έλλ ν΄λλ€!
import Foundation
let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 100)
for i in 1..<n+1 {
if dp[i] > dp[i+1] {
dp[i+1] = dp[i]
}
if i+arr[i][0] > n+1 {
continue
}
dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i+arr[i][0]])
}
print(dp.max()!)
dp.max()!κ°μ λ½μ§ μκ³ , dp[n+1]κ°μ λ½μλ λλ€~