1 ๋ถ„ ์†Œ์š”

๋ฐฑ์ค€ ์‚ฌ์ดํŠธ ๋งํฌ

๋ฌธ์ œ

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))

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ