๊ธฐ์ ์ฝ๋ฉํ ์คํธ ์ฐ์ต์ผ๋ก Swift๊ฐ ์๋๋ผ Python์ผ๋ก ํ์ดํ์ต๋๋ค ๐
โซ๏ธ ๋ฌธ์
https://www.acmicpc.net/problem/11055
โซ๏ธ ๋์ ํ์ด
์ด์ ์ ๋ณด๊ณ ์์ผํ ๊ฒ์ด ์๋ค. '๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ์์ด'์ ์ฃผ์ด์ง ์์ด ์์์ '์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด'์ ์ฐพ๋ ๋ฌธ์ ๋ค. LIS๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
https://didu-story.tistory.com/236
๋ด๊ฐ ์ด๋ ๊ฒ... ํฌ์คํ ๋ ํด๋จ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก LIS๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ ๋๊ฐ์ง๋ค. '์ด๋ถํ์'๋ฐฉ์์ ํ์ฉํ๋ ๊ฒ๊ณผ 'dp'๋ฅผ ์ด์ฉํ๋๊ฒ! ๋ ๊ฐ ๋ชจ๋ ์ฌ๋ฐ๋ฅธ ํ์ด์ด๊ธด ํ์ง๋ง, ์๊ฐ๋ณต์ก๋์ ์ฃผ์ํด์ผํ๋ค. dp๋ for๋ฌธ์ ์ด์ค์ผ๋ก ์ค์ฒฉํด์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ O(N^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ๋ฐ๋ฉด์, ์ด๋ถํ์์ ์ฌ์ฉํ๋ฉด O(nlogn)์ ์๊ฐ์ ๊ฐ๋๋ค. ๋๋ฌธ์, ์ฃผ์ด์ง N์ ๋ํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด์ ๋ฌธ์ ๋ฅผ ํ์ด์ผํ๋ค.
์ ๋ด ํฌ์คํ ์๋ dp๋ฅผ ์ด์ฉํด์ ๊ตฌํ๋ ๋ฐฉ์์ ์ค๋ช ํด๋๋ค. ๊ทธ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์ง๋ง, ์ด๋ฒ ๋ฌธ์ ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค. ์ด๋ฒ๋ฌธ์ ์์๋ ๊ฐ์ฅ ํฐ ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋๊ฒ ์๋๋ผ, ๋ถ๋ถ์์ด๋ค ์ค์, ๊ทธ ํฉ์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ์ ๋ต์ผ๋ก ๊ณจ๋ผ์ผํ๋ค. ๊ทธ๋ ๋ค๋ฉด, dp์ ์ด๋ค๊ฒ๋ค์ ๋ฃ์ด์ฃผ์ด์ผํ ๊น?
๋ด๊ฐ ์ฒ์์ ์๊ฐํ ๋ฐฉ์์ ์ด๊ฑฐ๋ค.
dp[i] = arr[i]๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ์ต๋ ํฉ
(์์)
arr = [1, 100, 2, 50] ์ด๋ผ์น์.
dp[0] ์๋ arr[0]์ด ๋ง์ง๋งํญ์ด ๋ Lis์ ํฉ์ ๋ฃ๋๋ค. ์ฆ, dp[0] = 1 ์ด๋๋ค.
dp[1] ์, 100์ด๊ณ ์ด์ (i-1) ๊ฐ๋ณด๋ค ํฌ๋ฏ๋ก, [1, 100]์ ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ด๋ค. ๊ทธ๋์ dp[1]์๋ ๋๊ฐ์ ํฉ์ธ 101์ ๋ฃ๋๋ค.
dp[2]๋ 2์ด๋ค. ์๊ณผ ๊ฐ์ด ์ด์ (i-1)๊ฐ๊ณผ ๋น๊ตํด๋ณด๋, 100์ด ๋ ํฌ๋ฏ๋ก ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ด ๋ ์ ์๋ค. ํ์ง๋ง, arr[i-2]๋ฒ์งธ์ธ 1๋ณด๋ค 2๊ฐ ํฌ๋ฏ๋ก, [1,2]๋ก ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ผ dp[2] ์๋ 1๊ณผ 2๋ฅผ ๋ํ 3์ ๋ฃ์ด์ค๋ค.
... (๊ณ์) ๐
์ด๋ ๊ฒ dp์ ๊ฐ์ ๋ฃ์ด์ค ์ ์์ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ dp[2]๋ฅผ ๊ตฌํ ๋, arr์์ 0๋ฒ์งธ ๋ถํฐ ์ํํ๋ฉด์ ํ์ฌ์ 2๋ณด๋ค ์์์ง ๋ด์ฃผ๊ณ , ์๋ค๋ฉด 1๊น์ง์ ํฉ (dp) + ํ์ฌ์ 2๋ฅผ ๋ํด์ฃผ๋ ์์ผ๋ก ๊ฐ๋ฉด ๋๋ค. ์ดํด๊ฐ ํ๋ค๋ค๋ฉด ์๋ ๊ทธ๋ฆผ์ ๋ณด์.
์์์ ๋ง๋ก ์ค๋ช ํด๋ ๊ฒ์ ์ด๋ ๊ฒ ๊ทธ๋ฆฌ๋ฉด์ ์๊ฐํ๋ค. ๋ง์ง๋ง i=2 ๊ฐ ๋์์๋, ์กฐ๊ฑด๊ณผ ์ด์ค for๋ฌธ์ ์๊ฐํด๋ผ ์ ์์๋ค.
โซ๏ธ ์ ๋ต ์ฝ๋
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(0, n):
dp[i] = arr[i]
for j in range(0, i):
if arr[j] < arr[i] and dp[i] < dp[j] + arr[i]:
dp[i] = max(dp[i], dp[j]+arr[i])
print(max(dp))