λ¬Έμ
μλ΄μμΌλ‘ μΌνκ³ μλ λ°±μ€μ΄λ ν΄μ¬λ₯Ό νλ €κ³ νλ€.
μ€λλΆν° N+1μΌμ§Έ λλ λ ν΄μ¬λ₯Ό νκΈ° μν΄μ, λ¨μ NμΌ λμ μ΅λν λ§μ μλ΄μ νλ €κ³ νλ€.
λ°±μ€μ΄λ λΉμμκ² μ΅λν λ§μ μλ΄μ μ‘μΌλΌκ³ λΆνμ νκ³ , λΉμλ ν루μ νλμ© μλ‘ λ€λ₯Έ μ¬λμ μλ΄μ μ‘μλμλ€.
κ°κ°μ μλ΄μ μλ΄μ μλ£νλλ° κ±Έλ¦¬λ κΈ°κ° $T_{i}$μ μλ΄μ νμ λ λ°μ μ μλ κΈμ‘ $P_{i}$λ‘ μ΄λ£¨μ΄μ Έ μλ€.
N = 7μΈ κ²½μ°μ λ€μκ³Ό κ°μ μλ΄ μΌμ νλ₯Ό 보μ.
1μΌμ μ‘νμλ μλ΄μ μ΄ 3μΌμ΄ 걸리며, μλ΄νμ λ λ°μ μ μλ κΈμ‘μ 10μ΄λ€. 5μΌμ μ‘νμλ μλ΄μ μ΄ 2μΌμ΄ 걸리며, λ°μ μ μλ κΈμ‘μ 15μ΄λ€.
μλ΄μ νλλ° νμν κΈ°κ°μ 1μΌλ³΄λ€ ν΄ μ μκΈ° λλ¬Έμ, λͺ¨λ μλ΄μ ν μλ μλ€. μλ₯Ό λ€μ΄μ 1μΌμ μλ΄μ νκ² λλ©΄, 2μΌ, 3μΌμ μλ μλ΄μ ν μ μκ² λλ€. 2μΌμ μλ μλ΄μ νκ² λλ©΄, 3, 4, 5, 6μΌμ μ‘νμλ μλ΄μ ν μ μλ€.
λν, N+1μΌμ§Έμλ νμ¬μ μκΈ° λλ¬Έμ, 6, 7μΌμ μλ μλ΄μ ν μ μλ€.
ν΄μ¬ μ μ ν μ μλ μλ΄μ μ΅λ μ΄μ΅μ 1μΌ, 4μΌ, 5μΌμ μλ μλ΄μ νλ κ²μ΄λ©°, μ΄λμ μ΄μ΅μ 10+20+15=45μ΄λ€.
μλ΄μ μ μ ν νμ λ, λ°±μ€μ΄κ° μ»μ μ μλ μ΅λ μμ΅μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ μΆλ ₯ μμ
νμ΄
μ¬μ€ μ΄ λ¬Έμ λ₯Ό μ§μ νμ§λ λͺ»νκ³ λ€λ₯Έ λΆλ€μ μ½λλ₯Ό μ°Έκ³ ν΄μ μ μ μΆ ν λ³΅μ΅ μ€μ΄λ€. μ¬μ€ μ΄ λ¬Έμ λ₯Ό μ²μ λ΄€μ λ 'μ΅λ μμ΅'λ§ λ³΄κ³ κ·Έλ¦¬λ μ νμΈ μ€ μμλλ° DPλ‘ λΆλ₯λμ΄ μκΈΈλ DPλ‘ λ체 μ΄λ»κ² νμ΄μΌ νμ§? μΆμλ€.
μΌλ¨ μ¬λ¬ μ½λλ₯Ό λ΄€μ λ λ‘μ§μ 곡ν΅μ μΌλ‘ μΈ λ¨κ³μλ€.
1. dpλΌλ λ°°μ΄μ μμ±νμ¬, κ° μΈλ±μ€μ ν΄λΉνλ λ μ§κΉμ§ μ»μ μ μλ μ΅λ μμ΅μ μ μ₯
2. λ°°μ΄μ λλ©΄μ κ° λ μ§μμ μμνλ μλ΄μ΄ ν΄μ¬μΌμ λμ§ μλ κ²½μ°, κ·Έ μλ΄μ μ§ννμ λμ νμ§ μμμ λμ μμ΅μ λΉκ΅νμ¬ dp λ°°μ΄ μ
λ°μ΄νΈ
3. λͺ¨λ λ μ§μ λν κ³μ°μ΄ λλλ©΄ dp λ°°μ΄μ μ΅λκ°μ΄ μ΅λ μμ΅μ΄ λ¨
λλ 2λ² κ³Όμ (=dp λ°°μ΄μ μ λ°μ΄νΈνλ λ°©λ²)μ λ μ¬λ¦¬μ§ λͺ»ν΄μ λ¬Έμ νμ΄ μ§λκ° μ λκ° κ² κ°λ€. μΌλ¨ DPλ μν₯μ(bottom-up)κ³Ό νν₯μ(top-down)μΌλ‘ λλ μ μκΈ° λλ¬Έμ λ κ°μ§ κ³Όμ μ λͺ¨λ μ 리ν΄λ³΄λ €κ³ νλ€.
1) Bottom-up
# Silver 3
import sys
N = int(input())
schedule = [] # [μλ΄κΈ°κ°, λΉμ©]μ μ μ₯νκΈ° μν λ°°μ΄
for _ in range(N):
schedule.append(list(map(int, sys.stdin.readline().split())))
dp = [0]*(N+1) # μμ΅μ μ μ₯νκΈ° μν λ°°μ΄
for i in range(N):
time, pay = schedule[i]
if i+time <= N: # μλ΄ κΈ°κ°μ΄ ν΄μ¬μΌμ λμ§ μλ κ²½μ°
dp[i+time] = max(dp[i+time], dp[i]+pay) # μλ΄ μ§ν
dp[i+1] = max(dp[i+1], dp[i]) # μλ΄ μ§ν X
print(dp[N])
μ¬κΈ°μ 18λ² λΌμΈ, 20λ² λΌμΈμ μν μ μ΄ν΄νκΈ°κ° μ’ μ΄λ €μ μ΄μ ChatGPTνν λ¬Όμ΄λ΄€λ€.
dp[i+time] = max(dp[i+time], dp[i]+pay)
βΎ νΉμ λ μ§μ μλ΄μ μ§ννκΈ°λ‘ νμ λμ μ΅λ μμ΅ κ³μ°
βΎ νμ¬ κ³ λ € μ€μΈ μλ΄μ μννκ³ λ νμ μμ΅ dp[i]+payμ i+time λ μ§μ κ³μ°λ μ΅λ μμ΅ dp[i+time] μ€ λ ν° κ°μ dp[i+time]μ μ μ₯
dp[i+1] = max(dp[i+1], dp[i])
βΎ νΉμ λ μ§μ μλ΄μ μ§ννμ§ μμ κ²½μ°, μ΄μ λ μ§κΉμ§μ μ΅λ μμ΅μ κ·Έλλ‘ λ€μ λ μ§λ‘ λκΉ
βΎ μ΄λ€ λ μ μλ΄μ ν μ μκ±°λ μλ΄μ νμ§ μκΈ°λ‘ κ²°μ νλ€λ©΄ κ·Έ λ μ μμ΅μ μ λ μμ΅κ³Ό κ°κΈ° λλ¬Έ
2) Top-down
# Silver 3
import sys
N = int(input())
schedule = []
for _ in range(N):
schedule.append(list(map(int, sys.stdin.readline().split())))
dp = [0] * (N+1)
for i in range(N-1, -1, -1):
time, pay = schedule[i]
if i + time <= N:
dp[i] = max(pay + dp[i+time], dp[i+1])
else:
dp[i] = dp[i+1]
print(dp[0])
Bottom-up λ°©μκ³Ό λ‘μ§μ κ°κ³ λ°©ν₯λ§ λ°λλ κ±°μ§λ§ forλ¬Έ μμ 쑰건문 λ΄μ©λ μ΄μ§ μ°¨μ΄κ° μλ€.
dp[i] = max(dp[i+time]+pay, dp[i+1])
βΎ dp[i+time]+payλ νμ¬ μλ΄μ μ ννμ λμ μμ΅ payμ μλ΄μ΄ λλλ λ i+time μ΄νμ μ΅λ μμ΅ dp[i+time]μ λν κ°
βΎ dp[i+1]μ νμ¬ μλ΄μ μ ννμ§ μκ³ λ€μ λ λ‘ λμ΄κ°μ λμ μ΅λ μμ΅
μ΄μ μ΄ λ¬Έμ νμ΄ μ 리ν΄λ κ±° κ°μ§κ³ DP μ ν λ§μ΄ νμ΄λ΄μΌκ² λ€β
'Problem Solving > BOJ & Programmers' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] 2839λ²: μ€ν λ°°λ¬ (1) | 2024.08.27 |
---|---|
[BOJ] 2217λ²: λ‘ν (1) | 2024.02.25 |
[BOJ] 2960λ²: RESETO (0) | 2024.01.18 |
[BOJ] 15686λ²: μΉν¨ λ°°λ¬ (0) | 2024.01.16 |
[BOJ] 1789λ²: μλ€μ ν© (1) | 2024.01.02 |