π[DP] λμ κ³νλ²(Dynamic Programming)μ΄λ?
λμ κ³νλ²(Dynamic Programming)μ΄λ?
λμ κ³νλ²μ ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλμ΄ νΈλ λ¬Έμ
λ₯Ό λ§νλ€.
ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλλ κ²μ λΆν μ 볡(Divide and Conquer)
μ λΉμ·ν΄λ³΄μΈλ€.
νμ§λ§ κ²°μ μ μΈ μ°¨μ΄μ μ΄ μλλ°, λ°λ‘ μμ λ¬Έμ κ° μ€λ³΅μ΄ μΌμ΄λλμ§ μΌμ΄λμ§ μλμ§
μ΄λ€.
λΆν μ 볡μ ν° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μ΄λ €μ μμ λ¬Έμ λ‘ λλμ΄ νΈλ λ°©μμ΄λ€. νΉμ§μ μμ λ¬Έμ μμ λ°λ³΅μ΄ μΌμ΄λμ§ μλλ€λ μ μ΄λ€.
λμ κ³νλ²μ μμ λ¬Έμ λ€μ΄ λ°λ³΅λλ κ²
μ΄ νΉμ§μ΄λ©°, μ΄λ₯Ό μ΄μ©ν΄ νμ΄λκ°λ λ°©μμ΄λ€.
λμ κ³νλ² λ°©λ²
λμ κ³νλ²μΌλ‘ λ¬Έμ λ₯Ό νΈλ λ°©λ²μ λͺ¨λ μμ λ¬Έμ λ€μ ν λ²λ§
νΈλ κ²μ΄λ€.
μ λ΅μ ꡬν μμ λ¬Έμ λ€μ μ΄λκ°μ λ©λͺ¨(Momoization)
ν΄λμλ€κ°, κ°μ μν©μ΄ λ°μνλ©΄ κ·Έ κ²°κ³Όκ°μ μ¬μ©νλ€.
λμ κ³νλ²μ 쑰건?
λμ κ³νλ²μ μ¬μ©νλ 쑰건μ λ€μκ³Ό κ°λ€.
- μμ λ¬Έμ κ° λ°λ³΅μ΄ μΌμ΄λλ κ²½μ°
- κ°μ λ¬Έμ λ ꡬν λλ§λ€ μ λ΅μ΄ κ°μμΌ ν¨
μ΄λ¬ν 쑰건μ λ§μ‘±νλ κ²½μ°λ§ λμ κ³νλ²μ μ¬μ©ν μ μλ€.
λμ κ³νλ² μμ½ - μ₯μ
- λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν΄μ μ€λ³΅ μ°μ°μ μ€μ
- μ€λ³΅ μ°μ°μ μ€μ¬μ μν μλλ₯Ό κ°μ ν¨
μμ - νΌλ³΄λμΉ μμ΄
νΌλ³΄λμΉ μμ΄
μ F(n) = F(n-1) + F(n-2)
μ μ νμμ κ°λ μμ΄μ΄λ€. μ΄ λ¬Έμ λ μ¬κ· ν¨μλ₯Ό ν΅ν΄ ν΄κ²°ν μ μμ§λ§, nμ΄
μ¦κ°ν¨μ λ°λΌ νΈμΆλλ ν¨μμ μκ° κΈ°νκΈμμ μΌλ‘ μ¦κ°νκΈ° λλ¬Έμ μΌμ μ μ΄μμ μμ΄μ ꡬνκΈ° μ΄λ ΅λ€.
μ¬κ·ν¨μ μ¬μ©
def fub(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
μ΄ λ¬Έμ λ₯Ό λμ κ³νλ²(DP)λ₯Ό μ¬μ©ν΄ μ κ·Όν΄λ³΄μ.
-
μμ λ¬Έμ λ€μ΄ λ°λ³΅λλ€.
μλ₯Ό λ€μ΄ F(5) = F(4) + F(3), F(4) = F(3) - F(2) μΈλ°, μ¬κΈ°μ F(3)μ΄ λ°λ³΅λλ κ²μ λ³Ό μ μλ€. μ¦, μμ λ¬Έμ κ° λ°λ³΅λκ³ μλ€λ λ»μ΄λ€.
-
κ°μ λ¬Έμ λ ꡬν λλ§λ€ μ λ΅μ΄ κ°λ€.
νΌλ³΄λμΉ μμ΄μ F(1)κ³Ό F(2)μ κ°μ λͺ¨λ 1λ‘ κ³ μ λμ΄ μλ€.
μ¦, 3λ²μ§Έ μμ΄μ μΈμ λ κ²°κ³Όκ°μ΄ 2μ΄κ³ , 4λ²μ§Έ μμ΄μ 2 + 1μ΄λ―λ‘ μΈμ λ κ²°κ³Όκ°μ΄ κ°λ€.
νΌλ³΄λμΉ μμ΄ DP
def fibo(n):
dp[0] = 1
dp[1] = 1
if n < 2:
return dp[n]
for i in range(2, n+1):
dp[i] = dp[i-2] + dp[i-1]
return dp[n]
μ°Έκ³ μλ£
https://galid1.tistory.com/507
https://www.youtube.com/watch?v=0bqfTzpWySY&t=423s
λκΈλ¨κΈ°κΈ°