๐งท ๋ฌธ์
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])