[λ°±μ€] (Python) 11055λ² - κ°μ₯ ν° μ¦κ°νλ μμ΄ (dp νμ΄ λ°©λ²)
κΈ°μ μ½λ©ν μ€νΈ μ°μ΅μΌλ‘ Swiftκ° μλλΌ PythonμΌλ‘ νμ΄νμ΅λλ€ π
β«οΈ λ¬Έμ
https://www.acmicpc.net/problem/11055
β«οΈ λμ νμ΄
μ΄μ μ λ³΄κ³ μμΌν κ²μ΄ μλ€. 'κ°μ₯ ν° μ¦κ°νλ μμ΄'μ μ£Όμ΄μ§ μμ΄ μμμ 'μ¦κ°νλ λΆλΆ μμ΄'μ μ°Ύλ λ¬Έμ λ€. LISλΌκ³ λΆλ¦°λ€.
https://didu-story.tistory.com/236
λ΄κ° μ΄λ κ²... ν¬μ€ν λ ν΄λ¨λ€.
κΈ°λ³Έμ μΌλ‘ LISλ₯Ό ꡬνλ λ°©μμ λκ°μ§λ€. 'μ΄λΆνμ'λ°©μμ νμ©νλ κ²κ³Ό 'dp'λ₯Ό μ΄μ©νλκ²! λ κ° λͺ¨λ μ¬λ°λ₯Έ νμ΄μ΄κΈ΄ νμ§λ§, μκ°λ³΅μ‘λμ μ£Όμν΄μΌνλ€. dpλ forλ¬Έμ μ΄μ€μΌλ‘ μ€μ²©ν΄μ λ§λ€κΈ° λλ¬Έμ O(N^2)μ μκ° λ³΅μ‘λλ₯Ό κ°λλ€. λ°λ©΄μ, μ΄λΆνμμ μ¬μ©νλ©΄ O(nlogn)μ μκ°μ κ°λλ€. λλ¬Έμ, μ£Όμ΄μ§ Nμ λνμ¬ μκ°λ³΅μ‘λλ₯Ό κ³ λ €ν΄μ λ¬Έμ λ₯Ό νμ΄μΌνλ€.
μ λ΄ ν¬μ€ν μλ dpλ₯Ό μ΄μ©ν΄μ ꡬνλ λ°©μμ μ€λͺ ν΄λλ€. κ·Έκ²μ κΈ°λ°μΌλ‘ λ¬Έμ λ₯Ό νμ§λ§, μ΄λ² λ¬Έμ λ μ‘°κΈ λ€λ₯΄λ€. μ΄λ²λ¬Έμ μμλ κ°μ₯ ν° μ¦κ°νλ λΆλΆμμ΄μ κΈΈμ΄λ₯Ό ꡬνλκ² μλλΌ, λΆλΆμμ΄λ€ μ€μ, κ·Έ ν©μ΄ κ°μ₯ ν° κ²μ μ λ΅μΌλ‘ 골λΌμΌνλ€. κ·Έλ λ€λ©΄, dpμ μ΄λ€κ²λ€μ λ£μ΄μ£Όμ΄μΌν κΉ?
λ΄κ° μ²μμ μκ°ν λ°©μμ μ΄κ±°λ€.
dp[i] = arr[i]λ₯Ό κΈ°μ€μΌλ‘ μ¦κ°νλ λΆλΆμμ΄μ μ΅λ ν©
(μμ)
arr = [1, 100, 2, 50] μ΄λΌμΉμ.
dp[0] μλ arr[0]μ΄ λ§μ§λ§νμ΄ λ Lisμ ν©μ λ£λλ€. μ¦, dp[0] = 1 μ΄λλ€.
dp[1] μ, 100μ΄κ³ μ΄μ (i-1) κ°λ³΄λ€ ν¬λ―λ‘, [1, 100]μ μ¦κ°νλ λΆλΆμμ΄μ΄λ€. κ·Έλμ dp[1]μλ λκ°μ ν©μΈ 101μ λ£λλ€.
dp[2]λ 2μ΄λ€. μκ³Ό κ°μ΄ μ΄μ (i-1)κ°κ³Ό λΉκ΅ν΄λ³΄λ, 100μ΄ λ ν¬λ―λ‘ μ¦κ°νλ λΆλΆμμ΄μ΄ λ μ μλ€. νμ§λ§, arr[i-2]λ²μ§ΈμΈ 1λ³΄λ€ 2κ° ν¬λ―λ‘, [1,2]λ‘ μ¦κ°νλ λΆλΆμμ΄μ λ§λ€ μ μλ€. κ·ΈλΌ dp[2] μλ 1κ³Ό 2λ₯Ό λν 3μ λ£μ΄μ€λ€.
... (κ³μ) π
μ΄λ κ² dpμ κ°μ λ£μ΄μ€ μ μμ κ²μ΄λ€.
μ¬κΈ°μ dp[2]λ₯Ό ꡬν λ, arrμμ 0λ²μ§Έ λΆν° μννλ©΄μ νμ¬μ 2λ³΄λ€ μμμ§ λ΄μ£Όκ³ , μλ€λ©΄ 1κΉμ§μ ν© (dp) + νμ¬μ 2λ₯Ό λν΄μ£Όλ μμΌλ‘ κ°λ©΄ λλ€. μ΄ν΄κ° νλ€λ€λ©΄ μλ κ·Έλ¦Όμ 보μ.
μμμ λ§λ‘ μ€λͺ ν΄λ κ²μ μ΄λ κ² κ·Έλ¦¬λ©΄μ μκ°νλ€. λ§μ§λ§ i=2 κ° λμμλ, 쑰건과 μ΄μ€ forλ¬Έμ μκ°ν΄λΌ μ μμλ€.
β«οΈ μ λ΅ μ½λ
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(0, n):
dp[i] = arr[i]
for j in range(0, i):
if arr[j] < arr[i] and dp[i] < dp[j] + arr[i]:
dp[i] = max(dp[i], dp[j]+arr[i])
print(max(dp))