๐Ÿงท ๋ฌธ์ œ

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

์นด๋“œ ํŒฉ์˜ ๊ฐ€๊ฒฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, N๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ๋Š” Bottom-Up ๋ฐฉ์‹์˜ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(DP)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 1.
 ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด n๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•˜๊ธฐ ์œ„ํ•œ ์ตœ๋Œ€ ๊ธˆ์•ก d[n]์€ d[n], d[1] + d[n-1], d[2] + d[n-2], ... , d[j] + d[n-j]์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’๊ณผ ๊ฐ™๋‹ค.

Step 2.
 for๋ฌธ์„ ๋Œ๊ธฐ ์ „ d[i]์˜ ๊ฐ’์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์€ card_pack[i]๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€ ํ›„์— j == 1์™€ j == i-1์€ ๊ฐ™์œผ๋ฏ€๋กœ j๋Š” i์˜ ์ ˆ๋ฐ˜๊นŒ์ง€๋งŒ ๋Œ๋„๋ก ํ•œ๋‹ค.

Step 3.
 for๋ฌธ์—์„œ i๊ฐ€ n๊นŒ์ง€ ๋ชจ๋‘ ๋Œ๊ฒŒ ๋˜๋ฉด n์žฅ์˜ ์นด๋“œ๋ฅผ ์‚ฌ๋Š”๋ฐ ์ง€๋ถˆํ•ด์•ผ ํ•˜๋‚œ ๊ธˆ์•ก์˜ ์ตœ๋Œ“๊ฐ’์ด d[n]์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

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

import sys

input = sys.stdin.readline

if __name__ == "__main__":
    n = int(input())
    card_pack = list(map(int, input().split()))
    card_pack.insert(0, 0)

    d = [0] * (n+1)
    d[1] = card_pack[1]

    for i in range(2, n+1):
        d[i] = card_pack[i]
        for j in range(1, i//2 + 1):
            d[i] = max(d[i], d[j]+d[i-j])

    print(d[n])