๐Ÿงท ๋ฌธ์ œ

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

๊ฐ ์Šคํ‹ฐ์ปค์— ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์–ด๋‚ด๋Š” ๋ฌธ์ œ์ด๋‹ค. (๋‹จ, ๋—€ ์Šคํ‹ฐ์ปค์˜ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์œ„, ์•„๋ž˜์— ์žˆ๋Š” ์Šคํ‹ฐ์ปค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.)

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ ๋˜ํ•œ ํ˜ผ์ž ํ’€๋‹ค๊ฐ€ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.
์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ๋ณด๋Š”๋ฐ๋„ ์ดํ•ด๊ฐ€ ํž˜๋“ค์—ˆ๋Š”๋ฐ, ๊ฑฐ์˜ ๋‹ค ๊ฐ™์€ ํ’€์ด์—ฌ์„œ ์กฐ๊ธˆ ๋” ์ƒ๊ฐ์„ ํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
์ด ์ค‘ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ์ฝ”๋“œ์˜ ํ’€์ด๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

1.

Step 1.
 ์Šคํ‹ฐ์ปค์˜ ์ ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ๋ฐ›์€ ํ›„์—, ์œ„์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ(up), ์•„๋ž˜์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ(down), ์•„๋ฌด๊ฒƒ๋„ ๋–ผ์ง€ ์•Š์€ ๊ฒฝ์šฐ(non) ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ’์„ ๊ตฌํ•ด๊ฐ„๋‹ค.

Step 2.
 for๋ฌธ์„ ๋Œ๋ฉด์„œ ์œ„์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ์—๋Š” max(์ด์ „์— ์•„๋ž˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ, ์•„๋ฌด๊ฒƒ๋„ ๋–ผ์ง€ ์•Š์€ ๊ฒฝ์šฐ),
์•„๋ž˜์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ์—๋Š” max(์ด์ „์— ์œ„์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ, ์•„๋ฌด๊ฒƒ๋„ ๋–ผ์ง€ ์•Š์€ ๊ฒฝ์šฐ),
์•„๋ฌด๊ฒƒ๋„ ๋–ผ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” max(์ด์ „์— ์œ„์ชฝ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ, ์ด์ „์— ์•„๋ž˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ)๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ•œ๋‹ค.

for i in range(n):
    up, down, non = max(down, non) + stickers[0][i], max(up, non) + stickers[1][i], max(up, down)    

Step 3.
 ์ด๋ ‡๊ฒŒ for๋ฌธ์„ n๋ฒˆ ๋ชจ๋‘ ๋Œ๊ฒŒ ๋˜๋ฉด ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๋Š” ๊ฐ’์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2.

Step 1.
 ์ ํ™”์‹์„ ์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ๋Š”๋ฐ, i๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ DP table (dp[0][i], dp[1][i])์€ ๊ฐ™์€ ํ–‰, i-1๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ฑฐ๋‚˜ ๋Œ€๊ฐ์„ ์— ์œ„์น˜ํ•œ i-1๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์— ํ•ด๋‹น stickers์ ์ˆ˜๋ฅผ ๋”ํ•ด์ค€ ๊ฐ’์„ ๋น„๊ตํ•ด ๋” ํฐ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

Step 2.
 ์ฆ‰, ์ ํ™”์‹์€ dp[0][i] = max(dp[0][i-1], dp[1][i-1] + stickers[0][i]), dp[1][i] = max(dp[1][i-1], dp[0][i-1] + stickers[1][i]) ์ด๋‹ค.

๋Š๋‚€์ 

์ฑ„์ ์„ ํ•ด๋ณธ ํ›„์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋ชจ๋“  ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ ์ ˆํ•œ ์ ํ™”์‹์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
์ด ๋ฌธ์ œ๋Š” Solved.ac ๊ธฐ์ค€ ์‹ค๋ฒ„ 2์˜ ๋‚œ์ด๋„์ธ๋ฐ, ์ด๋ ‡๊ฒŒ ๊ณ ์ƒํ•œ ๊ฑด ๋” ๋งŽ์ด ํ’€์–ด๋ณด๋ฉด์„œ ๋ณด์™„ํ•ด์•ผ ํ•  ์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

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

######1.######
import sys

if __name__ == "__main__":
    t = int(input())

    for _ in range(t):
        n = int(input())
        dp = [[0] * n for _ in range(2)]
        stickers = []
        for _ in range(2):
            stickers.append(list(map(int, input().split())))

        up, down, none = 0, 0, 0

        for i in range(n):
            up, down, none = max(down, none) + stickers[0][i], max(up, none) + stickers[1][i], max(up, down)    

        print(max(up, down, none))

######2.######
import sys

if __name__ == "__main__":
    t = int(input())

    for _ in range(t):
        n = int(input())
        dp = [[0] * n for _ in range(2)]
        stickers = []
        for _ in range(2):
            stickers.append(list(map(int, input().split())))

        dp[0][0], dp[1][0] = stickers[0][0], stickers[1][0]

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

        print(max(dp[0][n-1], dp[1][n-1]))