[๋ฐฑ์ค 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))
๋๊ธ๋จ๊ธฐ๊ธฐ