[λ°±μ€ 1912λ²] [π₯2] μ°μν© (python)
λ¬Έμ
nκ°μ μ μλ‘ μ΄λ£¨μ΄μ§ μμμ μμ΄μ΄ μ£Όμ΄μ§λ€. μ°λ¦¬λ μ΄ μ€ μ°μλ λͺ κ°μ μλ₯Ό μ νν΄μ ꡬν μ μλ ν© μ€ κ°μ₯ ν° ν©μ ꡬνλ €κ³ νλ€. λ¨, μλ ν κ° μ΄μ μ νν΄μΌ νλ€.
μλ₯Ό λ€μ΄μ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 μ΄λΌλ μμ΄μ΄ μ£Όμ΄μ‘λ€κ³ νμ. μ¬κΈ°μ μ λ΅μ 12+21μΈ 33μ΄ μ λ΅μ΄ λλ€.
μ λ ₯
첫째 μ€μ μ μ n(1 β€ n β€ 100,000)μ΄ μ£Όμ΄μ§κ³ λμ§Έ μ€μλ nκ°μ μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄μ΄ μ£Όμ΄μ§λ€. μλ -1,000λ³΄λ€ ν¬κ±°λ κ°κ³ , 1,000λ³΄λ€ μκ±°λ κ°μ μ μμ΄λ€.
μΆλ ₯
첫째 μ€μ λ΅μ μΆλ ₯νλ€.
μμ μ λ ₯ 1
10
10 -4 3 1 5 6 -35 12 21 -1
μμ μΆλ ₯ 1
33
μμ μ λ ₯ 2
10
2 1 -4 3 4 -4 6 5 -5 1
μμ μΆλ ₯ 2
14
μμ μ λ ₯ 3
5
-1 -2 -3 -4 -5
μμ μΆλ ₯ 3
-1
νμ΄
DP μ νμμ λ€μκ³Ό κ°λ€.
dp[i] = max(dp[i-1] + nums[i], nums[i])
μ¬κΈ°μ dp[i]λ nums 리μ€νΈμ iλ²μ§ΈκΉμ§μ μ΅λ μ°μν©μ μλ―Ένλ€. λ°λΌμ dp[0]μ nums[0]κ³Ό κ°λ€.
κ°κ°μ κ²½μ°μ λν΄μλ, μ΄μ κΉμ§μ μ΅λ μ°μν©κ³Ό νμ¬ κ°μ λν κ²κ³Ό νμ¬ κ° μ€μμ ν° κ°μ μ ννμ¬ μ΅λ μ°μν©μ κ°±μ νλ€. μ΄λ₯Ό λͺ¨λ μΈλ±μ€μ λν΄μ λ°λ³΅νλ©΄ DP ν μ΄λΈμ΄ μμ±λλ€.
λ§μ§λ§μΌλ‘ DP ν μ΄λΈμμ κ°μ₯ ν° κ°μ μ°Ύμμ μΆλ ₯νλ©΄ λλ€.
μ½λ
λκ°μ μ λͺ¨λ μκ° λ³΅μ‘λκ° O(n)μ΄λ€. μ λ ₯λ μμ΄μ ν λ² μννλ©° DP ν μ΄λΈμ μ±μ°κ³ , μ΅λ μ°μν©μ κ°±μ νκΈ° λλ¬Έμ΄λ€.
ver(1)
n = int(input()) # μμ΄μ κΈΈμ΄ μ
λ ₯λ°κΈ°
nums = list(map(int, input().split())) # μμ΄ μ
λ ₯λ°κΈ°
dp = [0] * n # DP ν
μ΄λΈ μ΄κΈ°ν
dp[0] = nums[0] # μ΄κΈ°κ° μ€μ
max_sum = nums[0] # μ΅λ μ°μν©μ μ μ₯ν λ³μ μ΄κΈ°ν
for i in range(1, n):
dp[i] = max(dp[i-1] + nums[i], nums[i]) # DP μ νμ
max_sum = max(max_sum, dp[i]) # μ΅λ μ°μν© κ°±μ
print(max_sum) # μ΅λ μ°μν© μΆλ ₯
ver(2) - def μ¬μ©
def dp(n, nums):
# n ν¬κΈ°μ 리μ€νΈ μμ±
dp = [0] * n
# 첫λ²μ§Έ μλ‘ μ΄κΈ°ν
dp[0] = nums[0]
# μ΅λ ν©
max_sum = nums[0]
# λλ²μ§Έ μλΆν° λκΉμ§
for i in range(1, n):
# νμ¬ μλ₯Ό ν¬ν¨νλ μ°μλ μμ΄μ μ΅λ ν©
dp[i] = max(dp[i-1] + nums[i], nums[i])
# μ΅λ ν© κ°±μ
max_sum = max(max_sum, dp[i])
# μ΅λ ν© λ°ν
return max_sum
# μμ΄μ κΈΈμ΄ μ
λ ₯λ°κΈ°
n = int(input())
# μμ΄ μ
λ ₯λ°κΈ°
nums = list(map(int, input().split()))
# μ΅λ μ°μν© κ΅¬νκΈ°
print(dp(n, nums))
λκΈλ¨κΈ°κΈ°