๐Ÿงท ๋ฌธ์ œ

https://www.acmicpc.net/problem/13398

n๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์—ฐ์†๋œ ๋ช‡๊ฐœ์˜ ์ˆ˜๋ฅผ ์„ ํƒํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. (๋‹จ, ์ˆ˜์—ด์—์„œ ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค(์ œ๊ฑฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.))

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ๋Š” 2์ฐจ์›์˜ DP table์„ ๊ตฌ์„ฑํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 1.
 ๋จผ์ € ์ˆ˜์—ด์—์„œ ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ (dp[i][1])์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ (dp[i][0])๋กœ ๋‚˜๋ˆ„์–ด์ค€๋‹ค.
 dp[0][0], dp[0][1] ์€ sequence[0]์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

Step 2.
 1๋ถ€ํ„ฐ n-1๊นŒ์ง€ for๋ฌธ์„ ๋Œ๋ฉด์„œ
 1. dp[i][0]์€ ์•„๋ฌด๋Ÿฐ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋˜๋ฏ€๋กœ, (์ด์ „๊นŒ์ง€์˜ ์—ฐ์†ํ•ฉ + i๋ฒˆ์งธ ์ˆ˜์—ด)๊ณผ i๋ฒˆ์งธ ์ˆ˜์—ด์˜ ๊ฐ’์„ ๋น„๊ตํ•ด ๊ทธ ์ค‘ ํฐ๊ฐ’์„ ๋Œ€์ž…ํ•ด์ค€๋‹ค.

  dp[i][0] = max(dp[i-1][0] + sequence[i], sequence[i])

 2. dp[i][1]์€ ์ˆ˜์—ด์˜ ํŠน์ • ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ, (i๋ฒˆ์งธ ์ˆ˜์—ด์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ)์™€ (i๋ฒˆ์งธ ์ด์ „์— ์ด๋ฏธ ํŠน์ • ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•ด i๋ฒˆ์งธ ์ˆ˜์—ด์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  dp[i][1] = max(dp[i-1][1] + sequence[i], dp[i-1][0])

Step 3.
 ์ด๋ ‡๊ฒŒ for๋ฌธ์„ n-1๋ฒˆ ๋Œ๋ฉด์„œ res๋Š” ๊ฐ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ๊ฒฝ์šฐ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
 res๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Š๋‚€์ 

์ฒ˜์Œ์— ์ด ๋ฌธ์ œ๋ฅผ ์ ‘ํ–ˆ์„ ๋•Œ๋Š” ์ˆ˜์—ด์—์„œ ์Œ์ˆ˜๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅํ•œ ํ›„์— ์Œ์ˆ˜๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ์˜ ์—ฐ์†ํ•ฉ์„ ๊ตฌํ•˜๋Š” O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๋‹น์—ฐํ•˜๊ฒŒ๋„ n์˜ ๋ฒ”์œ„๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. DP ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋“ค์„ ์ ‘ํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ DP table์„ ๊ตฌ์„ฑํ• ์ง€๊ฐ€ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋” ๋งŽ์ด ๊ฒฝํ—˜ํ•˜๊ณ  ๋” ๋ฐœ์ „ํ•ด์•ผ๊ฒ ๋‹ค.

๐Ÿ–Š ๋‚˜์˜ ์ฝ”๋“œ

def solution(n):
    sequence = list(map(int, input().split()))

    dp = [[0] * 2 for _ in range(n)]
    dp[0][0], dp[0][1] = sequence[0], sequence[0]

    res = sequence[0]

    for i in range(1, n):
        dp[i][0] = max(dp[i-1][0] + sequence[i], sequence[i])
        dp[i][1] = max(dp[i-1][1] + sequence[i], dp[i-1][0])
        res = max(dp[i][0], dp[i][1], res)

    return res


if __name__ == "__main__":
    N = int(input())
    print(solution(N))