[DP] λμ κ³νλ²(Dynamic Programming)
λμ κ³νλ²(Dynamic Programming)
1. λμ κ³νλ²
2. ꡬν λ°©λ²(νΌλ³΄λμΉ μμ )
1. λμ κ³νλ²
νλμ ν° λ¬Έμ λ₯Ό ν° λ¬Έμ λ₯Ό μμ λ¬Έμ λ‘ λλμ΄ ν΄κ²°νκ³ κ·Έ κ²°κ³Όλ₯Ό μ μ₯νμ¬ μ€λ³΅ κ³μ°μ νΌνλ νλμ λ°©λ²λ‘ μ λλ€.
λμ κ³νλ²μ νμ©νλ λν λ¬Έμ λ‘λ νΌλ³΄λμΉ μμ΄, μ΅μ₯ κ³΅ν΅ λΆλΆ μμ΄(LCS), λ°°λ λ¬Έμ , μ΅λ¨ κ²½λ‘, λμ κ±°μ€λ¦λ λ¬Έμ λ±μ΄ μμ΅λλ€.
DP(Dynamic Programming) λ¬Έμ λ₯Ό λ§λ¬μ λλ λΆλΆ λ¬Έμ λ₯Ό νμ©ν μ μλμ§, μ€λ³΅ κ³μ°μ μ€μΌ μ μλμ§ 2κ°μ§ μ¬νμ κ³ λ―Όνμ¬ μ μ©νλ©΄ λ©λλ€. ν΄λΉ ν¬μ€ν μμλ νΌλ³΄λμΉ μμ΄μΌλ‘ ꡬνν΄λ³΄κ² μ΅λλ€.
2. ꡬν λ°©λ²(νΌλ³΄λμΉ μμ )
- Bottom-Up λ°©μ(λ°λ³΅λ¬Έ)
μλ(κ°μ₯ μμ μν)μμλΆν° μ(ν° μν)λ‘ κ³μ°μ μννλ λ°©μμ λλ€.
int fib(int n) {
int dp[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
μ νμμ μ¬μ©ν΄μ dp[i]λ₯Ό κ³μ°ν©λλ€.
i | dp[i] κ° | μ€λͺ |
0 | 0 | 0 (μ΄κΈ°κ°) |
1 | 1 | 1 (μ΄κΈ°κ°) |
2 | 1 | dp[2] = 1 + 0 = 1 |
3 | 2 | dp[3] = 1 + 1 = 2 |
4 | 3 | dp[4] = 2 + 1 = 3 |
5 | 5 | dp[5] = 3 + 2 = 5 |
μμ κ°μ λ°©μμΌλ‘ μμ κ°λΆν° μ°¨λ‘λλ‘ μ±μλκ°κΈ° λλ¬Έμ μ€λ³΅ κ³μ°μ λ°©μ§ν©λλ€.
- Top-Down λ°©μ(λ©λͺ¨μ΄μ μ΄μ )
μ(κ°μ₯ ν° μν)μμλΆν° μλ(μμ μν)λ‘ κ³μ°μ μννλ λ°©μμ λλ€.
ν λ² κ³μ°ν κ²°κ³Όλ₯Ό μ μ₯νμ¬ μ€λ³΅ νΈμΆμ μ€μ λλ€.
int fib(int n) {
if (n <= 1) return n;
if (dp[n] != 0) return dp[n];
return dp[n] = fib(n - 1) + fib(n - 2);
}
if (n <= 1) return n; fib(0), fib(1)μ κ³ μ λ κ°μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ κ·Έλλ‘ λ°νν΄μ€λλ€.
if (dp[n] != 0) return dp[n]; μ²μμ dp λ°°μ΄μ λͺ¨λ 0μΌλ‘ μ΄κΈ°ννκΈ° λλ¬Έμ κ°μ΄ λ€μ΄κ°μ§ μμ λ°°μ΄μ κ°μ 0μΌ κ²μ λλ€. λ§μ½ κ°μ΄ λ€μ΄κ°λ€λ©΄ μ΄λ―Έ κ³μ°λ κ°μ΄λ―λ‘ μ¬κ· νΈμΆμμ΄ λ°νν©λλ€.
return dp[n] = fib(n - 1) + fib(n - 2); μ¬κ·μ μΌλ‘ νΈμΆνμ¬ dp[n]μ μ μ₯ν©λλ€.
DPλ λ§μ λ¬Έμ λ₯Ό 보면 ꡬννκΈ° μ½μ§ μλλΌκ΅¬μ..
κΎΈμ€ν λ¬Έμ λ₯Ό νκ³ νμ΅νκ² μ΅λλ€.
μ°Έκ³ μ¬μ΄νΈ
μκ³ λ¦¬μ¦ - Dynamic Programming(λμ κ³νλ²)
1. κ°μ DP, μ¦ λ€μ΄λλ―Ή νλ‘κ·Έλλ°(λλ λμ κ³νλ²)μ κΈ°λ³Έμ μΈ μμ΄λμ΄λ‘ νλμ ν° λ¬Έμ λ₯Ό μ¬λ¬ κ°μ μμ λ¬Έμ λ‘ λλμ΄μ κ·Έ κ²°κ³Όλ₯Ό μ μ₯νμ¬ λ€μ ν° λ¬Έμ λ₯Ό ν΄κ²°ν λ μ¬μ©νλ κ²μΌλ‘
hongjw1938.tistory.com
λ¬Έμ κ° μμΌλ©΄ λκΈ λ¨κ²¨μ£ΌμΈμ !
νΌλλ°±μ μΈμ λ νμμ λλ€ <3