DPλ?
GeeksforGeeksμ μνλ©΄ DPλ Sub-Problemλ€λ‘ λλμ΄ κ²°κ³Ό κ°μ μ μ₯ν¨μΌλ‘μ¨ κ³μ° μλ₯Ό μ€μ΄λ κ²μ λ§νλ€.
κ·Έλ¬λ μλ κ·Έμ μ μμ΄κ³ μ€μ λ‘ ν λλ λ€μκ³Ό κ°μ μ κ·Ό λ°©λ²μ΄ νΈν κ²μ΄λ€. DPλ λ¬Έμ λ€μ μμ Sub-ProblemμΌλ‘ μͺΌκ°μ΄ Sub-Problem κ°μ μκ΄ κ΄κ³μ μ§μ€νμ¬ κ²°κ³Όμ μΌλ‘ μ 체 Problemμ νΈλ λ°©λ²μ΄λ€.
μ‘°κΈ λ μΉκ·Όνκ² λ§νκΈ° μν΄ κ³λ¨μ λΉμ ν΄ λ³΄κ² λ€. μ°λ¦¬κ°Β λ²μ§Έ κ³λ¨μ λ°κΈ° μν΄μλΒ λ²μ§Έ κ³λ¨λ€μ λ°μμΌ νλ€. μμλλ‘ κ³λ¨μ λ°λλ€λ©΄ λμ λλ¬ν μ μλ€. λ¬Έμ κ° μ£Όμ΄μ‘μ λ κ³λ¨μΌλ‘ λ°κΎΈμ΄ μκ°ν΄ 보λλ‘ νλ€. μ΄λ ν μνμμ λ€μ μνλ‘ λμκ°κΈ° μν΄ λ¬΄μ¨ μΌμ ν΄μΌνλμ§ κ³ λ―Όνκ³ μ²μ μνμ λ μνλ₯Ό κ³ λ €νλ©΄ λ¬Έμ λ νλ¦°λ€.
νΌλ³΄λμΉ μμ΄μ μλ‘ λ€μ΄λ³΄μ.
μ κ³μ°νκΈ° μν΄μ μ¬κ· ν¨μλ₯Ό μ΄μ©νλ€λ©΄ μ κ³μ°ν λ κ° νμν λλ§λ€, μ κ³μ°ν΄μΌ νλ€. μ΄λ κ² νΌλ€λ©΄ κ΅μ₯ν λΉν¨μ¨μ μ΄μ§ μμκ°? μ΄ λ°©λ² λμ μ, μ΄μ λ κ°μ μ λ λ€μ κ°μ μ μ μλ€λ μ μ κ³ λ €νμ¬ μμλ‘ κ³μ°ν΄ λκ°λ€λ©΄ μ½κ² ν μ μλ€λ κ²μ μ μΆν μ μλ€.
μ΄μ²λΌ μμμ λ²μ§Έ Sub-Problemμ λνμ¬, λ²μ§Έ Sub-Problemμ ꡬν μ μλ€λ©΄ DPλ‘ ν μ μλ€. λν μ΄ λ λ°λμ μ²μ Sub-Problemκ³Ό λ§μ§λ§ Sub-Problemμ κ³ λ €ν΄μΌ νλ€. κ²½κ³ κ°μμ νλ‘κ·Έλ¨μ΄ λ²κ·Έλ₯Ό μΌμΌν¬ κ°λ₯μ±μ΄ λκΈ° λλ¬Έμ΄λ€. λμ€μ λ¬Έμ μ λμ΄λκ° μ‘°κΈ λ μμΉνλ€λ©΄, μμμ Sub-Problemμ λνμ¬ κ³Ό λ²μ§Έ Sub-Problemμ ꡬν μ μμ λ 2μ°¨μ DPλ ν μ μλ€. DPμ μ리λ₯Ό μ νμ
νλ€λ©΄ λ³΄λ€ μ΄λ €μ΄ 3, 4μ DP λ¬Έμ λ€λ ν μ μμ κ²μ΄λ€. (γ
γ
γ
γ
γ
γ
..)
λλΆλΆ λμΉλ₯Ό μ±κ² μ§λ§, μ νμμΌλ‘ λνλΌ μ μλ λͺ¨λ μμ΄μ DPλ‘ ν μ μλ€. νμ§λ§ μ΄ λ§μ΄ 곧 μ νμμΌλ‘ λνλΌ μ μλ€λ©΄ 무쑰건 DPλ‘ νμ΄μΌ νλ€λ κ²μ μλλ€. λ°λ‘λ‘ νΌλ³΄λμΉ μμ΄μ ꡬνλ O(logn)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ DPκ° μλ μκ³ λ¦¬μ¦μ΄ μλ€.
μ£Όλ‘ λμ€λ λ¬Έμ ?
μ½λ© ν
μ€νΈμ μμ£Ό λμ€λ DP λ¬Έμ λ€μ κ²½μ°μ μλ₯Ό νμ
νλ λ¬Έμ , μ‘°ν©μ ꡬνλ λ¬Έμ , LIS (Longest Increasing Subsequence) μ λλ‘ μμ½ν μ μλ€.
β’
κ²½μ°μ μλ₯Ό νμ
νλ λ¬Έμ
λ³΄ν΅ κΈ°μ΄μ μΈ λ¬Έμ λ€μ΄ λ§κ³ Sub-ProblemμΌλ‘ λλλ κ²λ§ μκ°νλ©΄ μ½κ² ν μ μλ€.
β’
μ‘°ν©μ ꡬνλ λ¬Έμ
μ‘°ν©μ 곡μμ λ€μκ³Ό κ°λ€.
μ΄λ₯Ό 곡μλλ‘ ν©ν 리μΌμ μ΄μ©ν΄μ νλ©΄ λ§€μ° λΉ λ₯΄κ² Overflowκ° λμμ μλͺ»λ κ°μ μ»κ² λλ€. μ‘°ν©μ λν 곡μμ μμ κ² λ§κ³ ν κ°μ§κ° λ μλ€. μ΄ κ³΅μμ νμ©νλ©΄, μ€κ° κ³μ° κ³Όμ μμ λ ν° κ°μ΄ λ±μ₯νμ§ μκΈ° λλ¬Έμ Overflowλ₯Ό νΌν μ μλ€.
νμ€μΉΌμ μΌκ°νμ μ 곡μμ μκ°μ μΌλ‘ λ³Ό μ μλ μΌκ°νμ΄λ€. νμ€μΉΌμ μΌκ°νμ μλμ κ°λ€.
νμ€μΉΌμ μΌκ°νμ μ μκ°ν΄λ³΄λ©΄, λ²μ§Έ μ€μ μλ©΄ λ²μ§Έ μ€μ μ μ μκ³ μ€κ° κ³μ° κ³Όμ μμ μ΅μ’
κ²°κ³Όλ³΄λ€ ν° κ°μ΄ λμ€μ§ μλ κ²μ μ μ μλ€. λ°λΌμ μ΅μ’
κ²°κ³Ό κ°μ΄ Overflowκ° λ°μνμ§ μλ κ°μ΄λΌλ©΄, μ΄ λ°©λ²μ ν΅ν΄μ λ¬Έμ μμ΄ μ λ΅μ ꡬν μ μλ κ²μ μ μ μλ€. λλΆλΆμ μ‘°ν© λ¬Έμ λ μ£Όμ΄μ§ λ¬Έμ κ° μ‘°ν©μ ꡬν΄μΌνλ λ¬Έμ μΈμ§ νμ
λ§ νλ©΄ μ½κ² ν μ μλ€.
β’
LIS (Longest Increasing Subsequence)
LISλ Longest Increasing Subsequenceμ μ½μλ‘ μ£Όμ΄μ§ μμ΄μ μ΅μ₯ λΆλΆ μμ΄μ ꡬνλ λ¬Έμ μ΄λ€. LISλ₯Ό ꡬνλ μ λͺ
ν λ°©λ²μΌλ‘λ μ΄λΆ νμμΌλ‘ O(nlogn)λ§μ ꡬνλ μκ³ λ¦¬μ¦λ μμ§λ§, DPλ₯Ό ν΅ν΄μλ ν μ μλ€.
DPλ₯Ό ν΅ν΄μ LISλ₯Ό νΈλ λ°©λ²μ μμ΄μ μμλ₯Ό νλμ© λ³΄λ©΄μ ν΄λΉ μμλ‘ λλλ LISμ κΈΈμ΄λ₯Ό μΆμ νλ©΄ LISλ₯Ό ꡬν μ μλ€. μμμ μμλ‘ λλλ LISλ₯Ό ꡬνκΈ° μν΄μ μκΈ°λ³΄λ€ μμλ©΄μ μκΈ°λ³΄λ€ μμ μμλ‘ λλλ LIS μ€ κ°μ₯ κΈ΄ LISλ₯Ό μ°ΎμμΌ νλ€. κ·Έ λ μ°Ύμ LIS λ€μ ν΄λΉ μμλ₯Ό λνλ©΄ κ·Έκ² ν΄λΉ μμλ‘ λλλ LIS μ΄κΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€μ΄λ³΄μ.
μ μΌ μμ μλ μ κ²½μ° μμ λ³΄λ€ μμ μμκ° μκΈ° λλ¬Έμ 첫 λ²μ§Έ μμλ‘ λλλ LISλ μ΄λ€.
κ·Έ λ€μ μμμΈ μ 보면 μμ λ³΄λ€ μμλ©΄μ μμ λ³΄λ€ μμ μμλ λ‘ 1κ°κ° μλ€. λ°λΌμ μΌλ‘ λλλ LISλ μ΄ λλ€.
κ·Έ λ€μ μμμΈ λ₯Ό 보면 μμ λ³΄λ€ μμλ©΄μ μμ λ³΄λ€ μμ μμλ λ‘ 1κ°κ° μλ€. λ°λΌμ λ‘ λλλ LISλ κ° λλ€.
κ·Έ λ€μ μμμΈ λ₯Ό 보면 μμ λ³΄λ€ μμλ©΄μ μμ λ³΄λ€ μμ μμλ κ³Ό κ° μλ€. μ΄ λ, λ‘ λλλ LISλ μ΄κ³ , λ‘ λλλ LISλ μ΄λ€. λ°λΌμ λ³΄λ€ κΈ΄ λ₯Ό λΆμ¬μ λ‘ λλλ LISλ κ° λλ€.
μ΄μ²λΌ κ° μμλ§λ€ ν΄λΉ μμλ‘ λλλ LISλ₯Ό μΆμ ν νμ κ·Έ μ€μμ κ°μ₯ κΈ΄ LISλ₯Ό μ°ΎμΌλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
λ©λͺ¨μ΄μ μ΄μ (Memoization)
λ©λͺ¨μ΄μ μ΄μ
μ μ€λ³΅ κ³μ°μ νΌνλ κ³μ° μ΅μ ν κΈ°λ²μ λ§νλ€. DP λ¬Έμ λ₯Ό νλ€λ³΄λ©΄ κ°μ κ°μ κ³μ νΈμΆνλ κ²½μ°κ° λ§λ€. μ§κΈμ νΌλ³΄λμΉ μμ΄μ κ³μν΄μ κ³μ°ν΄μΌ νλ€κ³ κ°μ ν΄λ³΄μ. μ²μμ μ κ°μ΄ νμνκ³ , κ·Έ μ§νμ κ°μ΄ νμνλ€λ©΄ μ΄ λ κ°μ κ³μ°νκΈ° μν΄μ νΌλ³΄λμΉ μμ΄ κ³μ°μ λ°λ‘ λ°λ‘ ν νμκ° μλ€λ κ²μ΄λ€. νΌλ³΄λμΉ μμ΄μ DP λ°©μμΌλ‘ κ³μ°νλ€κ³ κ°μ ν λ, μ κ³μ°νλ κ³Όμ μμ λΆν° κΉμ§ κ³μ°νκ² λλ€. μ κ³μ°νλ λμ κ·Έ μ κ°λ€μ λ°°μ΄μ μ μ₯νλ€λ©΄, μ λ€μ κ³μ°ν νμ μμ΄ λ°λ‘ κ°μ ꡬν μ μλ€. λ©λͺ¨μ΄μ μ΄μ
μ νΉλ³ν μ΄λ ΅μ§λ μκ³ DP μΈμλ λ§μ΄ μ¬μ©λλ μ΄ κ°λ
μ μ΅νλλ©΄ μ’λ€.