[BOJ][๐ก4][๋ฐฑ์ค#02228] ๊ตฌ๊ฐ ๋๋๊ธฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
N(1 โค N โค 100)๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ง 1์ฐจ์ ๋ฐฐ์ด์ด ์๋ค. ์ด ๋ฐฐ์ด์์ M(1 โค M โค โ(N/2)โ)๊ฐ์ ๊ตฌ๊ฐ์ ์ ํํด์, ๊ตฌ๊ฐ์ ์ํ ์๋ค์ ์ด ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ค ํ๋ค. ๋จ, ๋ค์์ ์กฐ๊ฑด๋ค์ด ๋ง์กฑ๋์ด์ผ ํ๋ค.
๊ฐ ๊ตฌ๊ฐ์ ํ ๊ฐ ์ด์์ ์ฐ์๋ ์๋ค๋ก ์ด๋ฃจ์ด์ง๋ค. ์๋ก ๋ค๋ฅธ ๋ ๊ตฌ๊ฐ๋ผ๋ฆฌ ๊ฒน์ณ์๊ฑฐ๋ ์ธ์ ํด ์์ด์๋ ์ ๋๋ค. ์ ํํ M๊ฐ์ ๊ตฌ๊ฐ์ด ์์ด์ผ ํ๋ค. M๊ฐ ๋ฏธ๋ง์ด์ด์๋ ์ ๋๋ค.
N๊ฐ์ ์๋ค์ด ์ฃผ์ด์ก์ ๋, ๋ต์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ์ ์ N, M์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๋ฐฐ์ด์ ์ด๋ฃจ๋ ์๋ค์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ฐฐ์ด์ ์ด๋ฃจ๋ ์๋ค์ -32768 ์ด์ 32767 ์ดํ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ต์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
6 2
-1
3
1
2
4
-1
์ถ๋ ฅ
9
My Sol
import sys
# sys.stdin = open('t.txt')
input = sys.stdin.readline
def foo(part, pe):
global N, M, ans, ssum
s = e = pe + 2
if part == M:
while s < N:
if e <= N:
ssum[part] = sarr[e] - sarr[s-1]
ans = max(ans, sum(ssum))
e += 1
else:
s += 1
e = s
return
while s < N:
if e <= N:
ssum[part] = sarr[e] - sarr[s-1]
foo(part+1, e)
e += 1
else:
s += 1
e = s
N, M = map(int, input().split())
arr = [int(input()) for _ in range(N)]
sarr = [0]*(N+1)
for i in range(1, N+1):
sarr[i] = sarr[i-1] + arr[i-1]
ssum = [0]*(M+1)
ans = -1e7
foo(1, -1)
print(ans)
์ฌ๊ท์ ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํด ์ง์ ๋ ๊ฐ์์ ๊ตฌ๊ฐ๋ง๋ค์ ํฉ์ ๊ตฌํด ans์ ์ต๋๊ฐ์ ๋งค๋ฒ ๊ฐฑ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋ค.
๊ฒฐ๊ณผ
์๊ฐ์ด๊ณผ
์๋ฌด๋๋ ๊ตฌ๊ฐ์ด ๋ง์์ง๋ฉด sarr์๋ ๊ฐ์ ๊ฐ์๊ฐ ๋ง์์ง๊ณ , ๊ทธ๋งํผ sumํ๊ณ ์ฌ๊ท ๋จ๊ณ๋ฅผ ์ค๊ฐ๋ ๊ณผ์ ์ด ๋ง์์ง๋ค๋ณด๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ๋ค.
๋ชจ๋ฒ๋ต์
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
con = [[0]+[-1e9]*m for i in range(n+1)]
notcon = [[0]+[-1e9]*m for i in range(n+1)]
for i in range(1, n+1):
num = int(input())
for j in range(1, min(m, (i+1)//2)+1):
notcon[i][j]=max(con[i-1][j], notcon[i-1][j])
con[i][j]=max(con[i-1][j], notcon[i-1][j-1])+num
print(max(con[n][m], notcon[n][m]))
ํน์ idx๊น์ง n๊ฐ์ ๊ตฌ๊ฐํฉ์ ๊ตฌํ๊ณ ์ ํ ๋, max(์์ ์์๋ฅผ ์ ์ธํ n-1๊ฐ์ ์ต๋ ๊ตฌ๊ฐํฉ, ์์ ์์๋ฅผ ํฌํจํ n๊ฐ์ ์ต๋ ๊ตฌ๊ฐํฉ)+ํ์ฌ๊ฐ์ ์ ์ฉํ๋ค๊ณ ํ๋ค. ์ด๋ป๊ฒ ์ด๋ฐ ๋ฐ์์โฆ. dp๋ ์ ๋ง ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค.
j์ ๋ฒ์๋ ์ range(1, min(m, (i+1)//2)+1)์ธ๊ฑธ๊น. ๊ตฌ๊ฐ์ด 1๊ฐ๋ถํฐ ๊ฐ๋ฅํ ๊ตฌ๊ฐ์ ๊ฐ์๋ฅผ ๋ฐ์ ธ์ผํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ๋ค. ๊ตฌ๊ฐ์ ๊ฐ์ j๋ m์ ๋๊ธธ ์ ์๊ณ , ๋ง์๋ (i+1//2)์ ๋๊ธธ ์ ์๋ค. ๋๋ฌธ์ ์ด๋ฐ ์ ์ฝ์ ๋์ง ์์์๊น.
๋๊ธ๋จ๊ธฐ๊ธฐ