๋ฌธ์
https://www.acmicpc.net/problem/11055
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x10๊ฐ - ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
์๊ณ ๋ฆฌ์ฆ: ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
ํ์ด
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ์์ด์ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์ค์์ ํฉ์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, ์์ด A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} ์ธ ๊ฒฝ์ฐ์ ํฉ์ด ๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} ์ด๊ณ , ํฉ์ 113์ด๋ค.
์ฒซ์งธ ์ค์ ์์ด A์ ํฉ์ด ๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ํฉ์ ์ถ๋ ฅํ๋ค.
11053: ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด๊ณผ ๋น์ทํ ๋ฌธ์ ๋ค.
N๋งํผ์ dp๋ฆฌ์คํธ๋ฅผ ์์ฑ ํ ์ด์ค for๋ฌธ์ ํตํด ์ฒดํฌํ๋ค.
dp[i] = i๋ฒ์งธ ์ซ์๋ฅผ ์ ํํ์๋์ ์ต๋๊ฐ
0๋ฒ์งธ ์ซ์๋ฅผ ์ ํํ์๋์ ์ต๋๊ฐ์ "0๋ฒ์งธ ์ซ์" ์ธ์๋ ์์ผ๋ฏ๋ก, dp[0]์ A[0]์ ํ ๋นํ ๋ค์ ์์ํ๋ค.
1๋ถํฐ N-1๋ฒ์งธ ์ซ์๊น์ง dp๋ฅผ ์ฑ์๋ฃ๋๋ค. ← ์ฒซ๋ฒ์งธ for๋ฌธ
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ซ์๋ง๋ค ํ์ฌ ์ซ์ ์ด์ ๊น์ง์ dp๋ฅผ ์ฒดํฌํด์ผํ๋ค. ← ๋๋ฒ์งธ for๋ฌธ
ํ์ฌ์ซ์๋ฅผ i, 0๋ถํฐ ์ด์ ์ซ์๊น์ง๋ฅผ j๋ผ๊ณ ํ์๋ A[j] < A[i]๋ผ๋ฉด ์ฆ๊ฐํ๋ ์์ด์ด๋ฏ๋ก, dp[i]๋ฅผ (ํ์ฌ๊น์ง์ ์ต๋๊ฐ dp[i], j๊น์ง์ ์ต๋๊ฐ dp[j] + ํ์ฌ ์ซ์) ์ค ๋ ํฐ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
๋ง์ฝ A[j] → A[i] ๊ฐ ์ฆ๊ฐํ๋ ์์ด์ด ์๋๋ผ๋ฉด (ํ์ฌ๊น์ง์ ์ต๋๊ฐ dp[i], ํ์ฌ ์ซ์ A[i]) ์ค ๋ ํฐ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
A[j]์ ๋ฒ์๋ 0 ~ i-1 ์ด๋ฏ๋ก ํ์ฌ A[j] ์ธ์ A[j] < A[i] ๋ฅผ ๋ง์กฑํ๋ j๊ฐ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ๋ชจ๋ dp์ค ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 204KB
from sys import stdin
input = stdin.readline
N = int(input())
A = list(map(int, input().split()))
dp = [0] * N
dp[0] = A[0]
for i in range(1, N):
for j in range(i):
if A[i] > A[j]:
dp[i] = max(dp[i], dp[j] + A[i])
else: # A[i] < A[j]
dp[i] = max(dp[i], A[i])
print(max(dp))
์ค๋๋ง์ DP ๋ฌธ์ ๋ค... DP๋ ์ด๊ธฐ์ ๊ธฐ์ค๊ฐ์ ์ ์ค์ ํ๋๊ฒ์ด ๊ด๊ฑด์ธ๋ฐ, ์ฐธ ์ด๋ ต๋คใ ใ