[νμ΄μ¬] μκ³ λ¦¬μ¦ ν¨λ¬λ€μ : Dynamic Programming μ°μ΅λ¬Έμ
2023.02.28 μ½λμ νμ΅λ΄μ©
π Dynamic Programming μ°μ΅λ¬Έμ
κ°μ§κ³ μλ μκΌΌλ¬κΌΌμΌλ‘ λ²μ΄λ€μΌ μ μλ μ΅λ μμ΅ κ΅¬νκΈ°
price_list : κ°μλ³ κ°κ²©μ΄ μ 리λμ΄ μλ 리μ€νΈ
count : νλ§€ν μκΌΌλ¬κΌΌ κ°μ
cache : κ°μλ³ μ΅λ μμ΅μ΄ μ μ₯λμ΄ μλ μ¬μ
π memoizationμΌλ‘ λ¬Έμ νκΈ°
β base case : 0κ° νμμ λ νΉμ 1κ° νμμ λμλ price_listμ κ°κ²© κ·Έλλ‘ μΆλ ₯
β‘ recursive case : μ΅λ μμ΅ κ΅¬νκΈ°
1κ° νμμ λ μμ΅ : 100
2κ° νμμ λ λμ¬ μ μλ μμ΅ : (1κ°, 1κ°) νμμ λ νΉμ (2κ°, 0κ°) νμμ λ
3κ° νμμ λ λμ¬ μ μλ μμ΅ : (1κ°, 2κ°) νμμ λ νΉμ (3κ°, 0κ°) νμμ λ
4κ° νμμ λ λμ¬ μ μλ μμ΅ : (1κ°, 3κ°) νμμ λ νΉμ (2κ°, 2κ°) νμμ λ νΉμ (0κ°, 4κ°) νμμ λ
5κ° νμμ λ λμ¬ μ μλ μμ΅ : (1κ°, 4κ°) νμμ λ νΉμ (2κ°, 3κ°) νμμ λ νΉμ (0κ°, 5κ°) νμμ λ
...
nκ° νμμ λ λμ¬ μ μλ μμ΅ : (1κ°, n-1κ°) & (2κ°, n-2κ°) & (3κ°, n-3κ°) & ( n // 2κ°, n - n // 2κ°) & (0κ°, nκ°)
for i in range(1, n // 2 + 1):
profit = max(max_profit_memo(price_list, i, cache) + max_profit_memo(price_list, n - i, cahce)
#μ¬κΈ°μ 0κ°, nκ° νλ§€νμ λ λμ€λ μμ΅μ νμΈ μνμ
μ¬κΈ°μ 0κ°, nκ° νλ§€κ° κ°λ₯ν κ²½μ°λ nμ΄ price_listμ 리μ€νΈ κ°μλ³΄λ€ μκ±°λ κ°μ κ²½μ°μλ§ κ°λ₯
if n < len(price_list):
profit = price_list[n]
else:
profit = 0
μμ κ²½μ°μ μλ₯Ό λͺ¨λ νμΈνμ¬ κ°μ₯ ν° κ°μ μ΅λ μμ΅μΌλ‘ μ μ₯
profit = max(profit, max_profit_memo(price_list, i, cache) + max_profit_memo(price_list, n - i, cahce))
π TabulationμΌλ‘ λ¬Έμ νκΈ°
λ°λ³΅λ¬Έ μ¬μ©νμ¬ λ¦¬μ€νΈ μ±μ°κΈ°
βΌβΌβΌ λ΄κ° μμ±ν μ½λ βΌβΌβΌ
μ°¨μ΄μ : for λ°λ³΅λ¬Έμ μ¬μ©νμ§ μκ³ λ°λ‘ maxκ°μ κ³μ°ν΄μ 리μ€νΈμ μ μ₯
λ΅μ λ§μ§λ§ for λ°λ³΅λ¬Έμ μ¬μ©νμ§ μμΌλ©΄ ν릴 μλ μμΌλ―λ‘ for λ°λ³΅λ¬Έμ μ¬μ©ν΄μ 1, i -1λΆν° 2//n, 1 - 2//nκΉμ§μ κ²½μ°μ μ μ€ κ°μ₯ ν° κ°μ μ μ₯νλλ‘ ν΄μΌν¨