์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 9465 ๐Ÿฅˆ] ์Šคํ‹ฐ์ปค

1eehyunji 2023. 11. 4. 01:35

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

 

9465๋ฒˆ: ์Šคํ‹ฐ์ปค

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” n (1 ≤ n ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ๋‘ ์ค„์—๋Š” n๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ •์ˆ˜๋Š” ๊ทธ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์Šคํ‹ฐ์ปค์˜

www.acmicpc.net

๋ฌธ์ œ

์ƒ๊ทผ์ด์˜ ์—ฌ๋™์ƒ ์ƒ๋ƒฅ์ด๋Š” ๋ฌธ๋ฐฉ๊ตฌ์—์„œ ์Šคํ‹ฐ์ปค 2n๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ๋‹ค. ์Šคํ‹ฐ์ปค๋Š” ๊ทธ๋ฆผ (a)์™€ ๊ฐ™์ด 2ํ–‰ n์—ด๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋‹ค. ์ƒ๋ƒฅ์ด๋Š” ์Šคํ‹ฐ์ปค๋ฅผ ์ด์šฉํ•ด ์ฑ…์ƒ์„ ๊พธ๋ฏธ๋ ค๊ณ  ํ•œ๋‹ค.

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

๋ชจ๋“  ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ผ ์ˆ˜ ์—†๊ฒŒ๋œ ์ƒ๋ƒฅ์ด๋Š” ๊ฐ ์Šคํ‹ฐ์ปค์— ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์–ด๋‚ด๋ ค๊ณ  ํ•œ๋‹ค. ๋จผ์ €, ๊ทธ๋ฆผ (b)์™€ ๊ฐ™์ด ๊ฐ ์Šคํ‹ฐ์ปค์— ์ ์ˆ˜๋ฅผ ๋งค๊ฒผ๋‹ค. ์ƒ๋ƒฅ์ด๊ฐ€ ๋—„ ์ˆ˜ ์žˆ๋Š” ์Šคํ‹ฐ์ปค์˜ ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ฆ‰, 2n๊ฐœ์˜ ์Šคํ‹ฐ์ปค ์ค‘์—์„œ ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋ฉด์„œ ์„œ๋กœ ๋ณ€์„ ๊ณต์œ  ํ•˜์ง€ ์•Š๋Š” ์Šคํ‹ฐ์ปค ์ง‘ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ์— ์ ์ˆ˜๊ฐ€ 50, 50, 100, 60์ธ ์Šคํ‹ฐ์ปค๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ ์ˆ˜๋Š” 260์ด ๋˜๊ณ  ์ด ๊ฒƒ์ด ์ตœ๋Œ€ ์ ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ์Šคํ‹ฐ์ปค (100๊ณผ 70)์€ ๋ณ€์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์‹œ์— ๋—„ ์ˆ˜ ์—†๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” n (1 ≤ n ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ๋‘ ์ค„์—๋Š” n๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ •์ˆ˜๋Š” ๊ทธ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์Šคํ‹ฐ์ปค์˜ ์ ์ˆ˜์ด๋‹ค. ์—ฐ์†ํ•˜๋Š” ๋‘ ์ •์ˆ˜ ์‚ฌ์ด์—๋Š” ๋นˆ ์นธ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ์ ์ˆ˜๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. 

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋งˆ๋‹ค, 2n๊ฐœ์˜ ์Šคํ‹ฐ์ปค ์ค‘์—์„œ ๋‘ ๋ณ€์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ์Šคํ‹ฐ์ปค ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

  • ์ด ๋ฌธ์ œ๋Š”.. ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ•ด๋ณด๋‹ค ๊ฒฐ๊ตญ ํ’€์ง€ ๋ชปํ•˜๊ณ  ์ธํ„ฐ๋„ท์— ๊ฒ€์ƒ‰ํ•ด์„œ ํ‘ผ ๋ฌธ์ œ๋‹ค ใ… ใ…  .. 
  • DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฌธ์ œ์ธ๋ฐ, dp[i][j] ๊ฐ’์ด ํ•ด๋‹น ์œ„์น˜์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ€ ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.
  • 0ํ–‰ 0์—ด ๋˜๋Š” 1ํ–‰ 0์—ด์€ ์ตœ๋Œ€ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. 
  • ๊ทธ๋ž˜์„œ 0ํ–‰ 0์—ด์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ์™€, 1ํ–‰ 0์—ด์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ dp[0][n-1]๊ณผ dp[1][n-1] ์ค‘ ๋” ํฐ ๊ฐ’์ด ๋‹ต์ด ๋œ๋‹ค.

  • ๋ฌธ์ œ์—์„œ ์ค€ ์˜ˆ์ œ๋กœ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด, ๊ฐ ์œ„์น˜์—์„œ ์ด์ „ ๋‹จ๊ณ„์— ๊ฑฐ์น  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ€์ง€์ด๋‹ค. 
    • ์ „ ๋‹จ๊ณ„  ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ
    • ์ „์ „ ๋‹จ๊ณ„ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ
  • ์ด ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ’๊ณผ ํ˜„์žฌ ์œ„์น˜์˜ ์ ์ˆ˜๋ฅผ ํ•ฉ์ณ์„œ dp ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • dp[0][j]=max(dp[1][j-1], dp[1][j-2])+score[0][j]
    • dp[1][j]=max(dp[0][j-1], dp[0][j-2])+score[1][j]
  • ๊ทธ๋ฆฌ๊ณ  max(dp[0][n-1], dp[1][n-1])์„ ๋น„๊ตํ•ด์„œ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
import sys

t=int(sys.stdin.readline())
for _ in range(t):
    n=int(sys.stdin.readline())
    score=[list(map(int, sys.stdin.readline().split(' '))) for _ in range(2)]

    # dp[i][j] = ํ•ด๋‹น ์œ„์น˜์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ€ ํ•ฉ
    dp=[[0]*(n) for _ in range(2)]
    dp[0][0]=score[0][0]
    dp[1][0]=score[1][0]

    for idx in range(1,n):
        # 1๋ฒˆ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ, ๊ฐ ์‹œ์ž‘์ ์—์„œ ๋Œ€๊ฐ์„ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
        if idx==1:
            dp[1][idx]=dp[0][0]+score[1][idx]
            dp[0][idx]=dp[1][0]+score[0][idx]
            continue
        # ๊ฐ ์œ„์น˜์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
        # ๊ฐ ์œ„์น˜์—์„œ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ€์ง€์ด๋‹ค.
        # 1) ๋ฐ”๋กœ ์ด์ „ ์—ด์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ
        # 2) ๋‘ ์—ด ์ด์ „์˜ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ
        # ๋‘ ๊ฒฝ์šฐ ์ค‘ ๋” ํฐ dp ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•œ๋‹ค.
        dp[0][idx]=max(dp[1][idx-1], dp[1][idx-2])+score[0][idx]
        dp[1][idx]=max(dp[0][idx-1], dp[0][idx-2])+score[1][idx]
    # 0ํ–‰ 0์—ด์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ์™€ 1ํ–‰ 0์—ด์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋น„๊ตํ•ด์„œ ๋” ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
    print(max(dp[0][n-1], dp[1][n-1]))