์์๊ฐ n๊ฐ์ธ ๋ฐฐ์ด์ ์ผ๋ถ ์์๋ฅผ ๊ณจ๋ผ๋ด์ ๋ง๋ ๋ถ๋ถ ์์ด ์ค ๊ฐ ์์๊ฐ ์ด์ ์์๋ณด๋ค ํฌ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ , ๊ทธ ๊ธธ์ด๊ฐ ์ต๋์ธ ๋ถ๋ถ ์์ด์ ์ต๋ ๋ถ๋ถ ์ฆ๊ฐ์์ด(์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด)์ด๋ผ๊ณ ํ๋ค.
์ด ๋ฌธ์ ์ ์ ํ์ DP ๋ฌธ์ ๋ก ์์ฃผ ๋์ค๋ ์ ํ์ด๋ฉฐ, O(N^2) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ O(NlogN)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
๋ฌธ์ ์ ํจ๊ป ์ดํดํด๋ณด์.
N๊ฐ์ ์์ฐ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์ฃผ์ด์ก์ ๋, ๊ทธ ์ค์์ ๊ฐ์ฅ ๊ธธ๊ฒ ์ฆ๊ฐํ๋(์์ ์์์ ํฐ ์๋ก) ์์๋ค์ ์งํฉ์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ์๋ฅผ ๋ค์ด, ์์๊ฐ 2, 7, 5, 8, 6, 4, 7, 12, 3 ์ด๋ฉด ๊ฐ์ฅ ๊ธธ๊ฒ ์ฆ๊ฐํ๋๋ก ์์๋ค์ ์ฐจ๋ก๋๋ก ๋ฝ์๋ด๋ฉด 2, 5, 6, 7, 12๋ฅผ ๋ฝ์๋ด์ด ๊ธธ์ด๊ฐ 5์ธ ์ต๋ ๋ถ๋ถ ์ฆ๊ฐ์์ด์ ๋ง๋ค ์ ์๋ค.
โฃ ์
๋ ฅ์ค๋ช
์ฒซ์งธ ์ค์ ์
๋ ฅ๋๋ ๋ฐ์ดํฐ์ ์ N(2โคNโค1,000, ์์ฐ์)๋ฅผ ์๋ฏธํ๊ณ ,
๋์งธ ์ค์ N๊ฐ์ ์
๋ ฅ๋ฐ์ดํฐ๋ค์ด ์ฃผ์ด์ง๋ค.
โฃ ์ถ๋ ฅ์ค๋ช
์ฒซ ๋ฒ์งธ ์ค์ ๋ถ๋ถ์ฆ๊ฐ์์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
โฃ ์
๋ ฅ์์ 1
8
5 3 7 8 6 2 9 4
โฃ ์ถ๋ ฅ์์ 1
4
import sys
# sys.stdin = open("input.text", "rt")
n = int(input())
data = list(map(int, input().split()))
data.insert(0,0) #1๋ฒ ์ธ๋ฑ์ค๋ถํฐ ํ์ธํ๊ธฐ ์ํด์ ์์ ์ฝ์
dp = [0] * (n+1)
dp[1] = 1 #๊ฐ๊ด์ ์ผ๋ก ์๋ช
ํ๊ฑด ๋ฏธ๋ฆฌ ์ฐ์
res = 0
for i in range(2,n+1):
max_length = 0
for j in range(1,i): #i๋ณด๋ค ์์๊น์ง ๋๋ฉด์ ์ต์ฅ ๋ถ๋ถ ์ฆ๊ฐ์์ด ์ต๋๊ฐ์ ์ฐพ๋๋ค.
if data[j] < data[i] and dp[j] > max_length: #data[i]์ ๊ฐ, ์ฆ i๋ฒ์งธ ์ซ์๊ฐ ๋ด๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ์ฆ๊ฐ์์ด์ ๋ง์ง๋ง ํญ์ ์๋ฏธํด
max_length = dp[j] #dp[j]๋ data[j], ์ฆj๋ฒ์งธ ํญ์ด ๋ง์ง๋ง ํญ์ธ ์ฆ๊ฐ์์ด์ ์ต๋ ๊ธธ์ด
dp[i] = max_length + 1
if dp[i] > res:
res = dp[i]
print(res)
ํด๋น ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด n๊ฐ์ ์์ฐ์๋ก ์ด๋ฃจ์ด์ง ์์ด์์ ๊ฐ์ฅ ๊ธธ๊ฒ ์ฆ๊ฐํ๋ (์์ ์์์ ํฐ ์๋ก) ์์๋ค์ ์งํฉ์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ฉด ๋๋ค.
๋ฌธ์ ์ ์๊ฐ์ ์์์ "๊ธฐ์ค"์ด ์์ด์ผ ํ๋ค. ์ผ๋จ ์กฐ๊ฑด์์ ์ด๋ ์๋๋๊ฑฐ ์ค๋ช ํ์.
โฝ ์ฒ์์ ๋ฐํ ์ ๋ฐฉ์์ผ๋ก (์ผ๋จ dp๋ฌธ์ ๋ผ๋ ๊ฑด ํ์ ํ๋ค๋ ์ ์ ) ๊ฐ๋จํ ๋ฌธ์ ๋ก ์ต์ํ ์ํจ ํ์ ์ ์ ํ์ฅํ๋ ๋ฐฉ์์ผ๋ก ํ์ด์ผ ํ๋๊น ๋ฐฐ์ด์์ ๊ฐ์ฅ ์ผ์ชฝ์์๋ถํฐ ํด๋น ์ซ์๊น์ง ๋ง๋ค ์ ์๋ ์์ด ์ค์ ์ฆ๊ฐํ๋ ์์ด์ ์ฐพ๋ ๊ฒ์ด๋ค.
โฝ ์๋ฅผ ๋ค์ด ์ฃผ์ด์ง ์์ ์ฒ๋ผ 5 3 7 8 6 2 9 4 ์ ์์ด์ด ์ฃผ์ด์ง๋ฉด...
โฝ ์ด๋ฐ ์์ผ๋ก ์ ์ ์์ ๋ฌธ์ ๋ฅผ ํ์ฅํ๋ ๋ฐฉ์์ผ๋ก ํ์ด๋๊ฐ๋ ๋ฌธ์ !! ์ต๋ ๋ถ๋ถ ์ฆ๊ฐ ์์ด ๋ฌธ์ ์ด๋ค ! (์ญ์ dp๋ฌธ์ ์ ํ ์ข ๋ฅ)
dp ํ ์ด๋ธ์ ๊ฐ ์ธ๋ฑ์ค์ ์๋ ๊ฐ์ ํด๋น ์ซ์๋ฅผ ๋ง์ง๋ง ํญ์ผ๋ก ํ๋ ์ฆ๊ฐ์์ด ์ค ๊ฐ์ฅ ๊ธด ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค.
์ด๋ฐ ์์ผ๋ก ์ ์ฒด ์์ด์ ์ญ ์งํํ๋ฉด ๋๋ค !!
for i in range(2,n+1):
max_length = 0
for j in range(1,i):
if data[j] < data[i] and dp[j] > max_length: #data[i]์ ๊ฐ, ์ฆ i๋ฒ์งธ ์ซ์๊ฐ ๋ด๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ์ฆ๊ฐ์์ด์ ๋ง์ง๋ง ํญ์ ์๋ฏธํด
max_length = dp[j] #dp[j]๋ data[j], ์ฆj๋ฒ์งธ ํญ์ด ๋ง์ง๋ง ํญ์ธ ์ฆ๊ฐ์์ด์ ์ต๋ ๊ธธ์ด
dp[i] = max_length + 1
if dp[i] > res:
res = dp[i]
โฝ ์๊น ๋งํ๋ ๋๋ก i๋ฒ์งธ ์์๊น์ง ์ฆ๊ฐ์์ด์ ์ต๋๊ธธ์ด + 1์ด๋ฏ๋ก i-1๊น์ง ๋๋ฉด์ dp์ ์ต๋๊ฐ์ ์ฐพ์. dp[j]๋ j๋ฒ์งธ ํญ์ด ๋ง์ง๋ง ํญ์ธ ์ฆ๊ฐ์์ด์ ์ต๋๊ธธ์ด. ๊ทธ๋ ๊ฒ ํด์ ์ฐพ์ ๊ฐ์ + 1์ ํด์ฃผ๋ฉด i๋ฒ์งธ๊ฐ ๋ง์ง๋ง ํญ์ธ ์ฆ๊ฐ์์ด์ ์ต๋ ๊ธธ์ด๊ฐ ์ ์ฅ ๋ผ.
์์์ ํ์ด๋ณธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋ก O(N^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด์๋ค.
O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฝค๋ ๊ฐ๋จํ๋ค.
์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์ด์ ์์๋ฅผ ํ๋์ฉ ํ์ํ๋ฉด์, ๊ทธ ์ด์ ์ ์์๋ค์ ๋ชจ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ O(N^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ๋ฐ๋ผ์ n์ด 10000๋ณด๋ค ์ปค์ง๋ฉด ์๊ฐ์ด ๋งค์ฐ ์ค๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ค...
x = int(input())
arr = list(map(int, input().split()))
dp = [1 for i in range(x)]
for i in range(x):
for j in range(i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j] + 1)
max_dp = max(dp)
print(max_dp)
max_idx = dp.index(max_dp)
lis = []
while max_idx >= 0:
if dp[max_idx] == max_dp:
lis.append(arr[max_idx])
max_dp -= 1
max_idx -= 1
lis.reverse()
print(*lis)
โฝ max_idx์ ๊ฐ๋ถํฐ ์์ํ์ฌ ๊ฑฐ๊พธ๋ก ์ํํ๋ฉฐ arr์ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
max_dp๊ฐ 4๊ณ , max_idx๋ 5์ด๋ฏ๋ก arr[5] = 10์์๋ถํฐ ๊ฑฐ๊พธ๋ก ์ํํ๋ฉด ๋๋ค. ๊ทธ๋ค์์ผ๋ก ์ฌ ์์๋ arr[4] = 5, arr[3] = 2, arr[0] = 1์ด ๋๋ค.
lis = [10, 5, 2, 1]์ด๋ฉฐ ์ด๊ฑธ ๋ค์ง์ด์ ์ถ๋ ฅํ๋ฉด ์ํ๋ ์ ๋ต์ ์ป์ ์ ์๋ค.
์ด๋ ๊ฒ LIS ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ฑํด๋ณด์๋ค. ์ฌ๊ธฐ์ ํ์ดํ ๋ฌธ์ ๋ค ๋ง๊ณ ๋ ๊ด๋ จํ ๋ฌธํญ๋ค์ด ๋ ์์ผ๋ ํด๋น ๋ฌธ์ ๋ค๋ ๋์ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๐จ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ํ์ฉํ ๋ฌธ์ ๋ค์ ํ์ด๋ณด๋ฉด์ ์ด๋ค ์ ํ์ผ ๋ ํด๋น ์๊ณ ๋ฆฌ์ฆ(dp)๋ฅผ ์จ์ผํ ์ง ์๊ฐํด๋ณด์.
์ผ์ชฝ์ ๋ฒํธ์ ์ค๋ฅธ์ชฝ์ ๋ฒํธ๊ฐ ์๋ ๊ทธ๋ฆผ์์ ๊ฐ์ ๋ฒํธ๋ผ๋ฆฌ ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค. ์ผ์ชฝ๋ฒํธ๋ ๋ฌด์กฐ๊ฑด ์์์๋ถํฐ ์ฐจ๋ก๋ก 1๋ถํฐ N๊น์ง ์ค๋ฆ์ฐจ์์ผ๋ก ๋์ด๋์ด ์์ต๋๋ค.์ค๋ฅธ์ชฝ์ ๋ฒํธ ์ ๋ณด๊ฐ ์๋ถํฐ ์๋ ์์๋ก ์ฃผ์ด์ง๋ง ์๋ก ์ ์ด ๊ฒน์น์ง ์๊ณ ์ต๋ ๋ช๊ฐ์ ์ ์ ์ฐ๊ฒฐํ ์ ์๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์์ ๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ ๋ฒํธ ์ ๋ณด๊ฐ 4 1 2 3 9 7 5 6 10 8 ๋ก ์
๋ ฅ๋์์ ๋ ์ ์ด ์๋ก๊ฒน์น์ง ์๊ณ ์ฐ๊ฒฐํ ์ ์๋ ์ต๋ ์ ์ ๊ฐ์ 6์ ๊ตฌํ ๊ฒฝ์ฐ์
๋๋ค.
โฃ ์
๋ ฅ์ค๋ช
์ฒซ ์ค์ ์์ฐ์ N(1<=N<=100)์ด ์ฃผ์ด์ง๋๋ค.
๋ ๋ฒ์งธ ์ค์ 1๋ถํฐ N๊น์ง์ ์์ฐ์ N๊ฐ์ ์ค๋ฅธ์ชฝ ๋ฒํธ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ค. ์์๋ ์์ชฝ๋ฒํธ ๋ถํฐ ์๋์ชฝ๋ฒํธ ์์ผ๋ก์
๋๋ค.
โฃ ์ถ๋ ฅ์ค๋ช
์ฒซ ์ค์ ๊ฒน์น์ง ์๊ณ ๊ทธ์ ์ ์๋ ์ต๋์ ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
โฃ ์
๋ ฅ์์ 1
10
4 1 2 3 9 7 5 6 10 8
โฃ ์ถ๋ ฅ์์ 1
6
import sys
sys.stdin = open("input.text", "rt")
#์ต๋ ์ ์ฐ๊ฒฐํ๊ธฐ
n = int(input())
data = list(map(int, input().split()))
dp = [0] * n
dp[0] = 1
res = 0
for i in range(1,n):
max_length = 0
for j in range(i):
if data[j] < data[i] and dp[j] > max_length:
max_length = dp[j]
dp[i] = max_length + 1 #์ด์ ๊น์ง์ ์ต์ฅ๊ฑฐ๋ฆฌ + 1
res = max(dp)
print(res)
์ผ์ชฝ ์ซ์๋ ์ค๋ฆ์ฐจ์์ผ๋ก ๋์ด๋์ด ์๊ณ , ์ค๋ฅธ์ชฝ์ ์ ๋ ฌ๋์ด ์์ง๋ ์์..
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๊ฐ์ผ๋ก๋ ์ค๋ฅธ์ชฝ์์ ์ ํ์ ํ ๊ฒ์ธ๋ฐ ๊ฒฐ๊ตญ ์ผ์ชฝ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ ์ค๋ฅธ์ชฝ๋ ์ต๋ํ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ๋์ด ์์ผ๋ฉด ๊ต์ฐจํ์ง ์๋ ์ต๋ ์ ์ ๊ฐ์๋ฅผ ์ ์ ์๊ฒ ๋๋ค !
๐ป ๊ฒฐ๋ก ์ ์ต์ฅ ๋ถ๋ถ ์ฆ๊ฐ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด์ด ์ ์ฌ๊ฐํ์ธ ์ง์ก๋ฉด์ฒด ๋ฒฝ๋๋ค์ ์ฌ์ฉํ์ฌ ํ์ ์๊ณ ์ ํ๋ค. ํ์ ๋ฒฝ๋์ ํ ๊ฐ์ฉ ์๋์์ ์๋ก ์์ผ๋ฉด์ ๋ง๋ค์ด ๊ฐ๋ค. ์๋์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ๊ฐ์ฅ ๋์ ํ์ ์์ ์ ์๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
(์กฐ๊ฑด1) ๋ฒฝ๋์ ํ์ ์ํฌ ์ ์๋ค. ์ฆ, ์๋ฉด์ ๋ฐ๋ฉด์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
(์กฐ๊ฑด2) ๋ฐ๋ฉด์ ๋์ด๊ฐ ๊ฐ์ ๋ฒฝ๋์ ์์ผ๋ฉฐ, ๋ํ ๋ฌด๊ฒ๊ฐ ๊ฐ์ ๋ฒฝ๋๋ ์๋ค.
(์กฐ๊ฑด3) ๋ฒฝ๋๋ค์ ๋์ด๋ ๊ฐ์ ์๋ ์๋ค.
(์กฐ๊ฑด4) ํ์ ์์ ๋ ๋ฐ๋ฉด์ด ์ข์ ๋ฒฝ๋ ์์ ๋ฐ๋ฉด์ด ๋์ ๋ฒฝ๋์ ๋์ ์ ์๋ค.
(์กฐ๊ฑด5) ๋ฌด๊ฒ๊ฐ ๋ฌด๊ฑฐ์ด ๋ฒฝ๋์ ๋ฌด๊ฒ๊ฐ ๊ฐ๋ฒผ์ด ๋ฒฝ๋ ์์ ๋์ ์ ์๋ค.
โฃ ์
๋ ฅ์ค๋ช
์
๋ ฅ ํ์ผ์ ์ฒซ์งธ ์ค์๋ ์
๋ ฅ๋ ๋ฒฝ๋์ ์๊ฐ ์ฃผ์ด์ง๋ค. ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋ฒฝ๋์ ์๋ ์ต๋ 100๊ฐ์ด๋ค. ๋์งธ ์ค๋ถํฐ๋ ๊ฐ ์ค์ ํ ๊ฐ์ ๋ฒฝ๋์ ๊ดํ ์ ๋ณด์ธ ๋ฒฝ๋ ๋ฐ๋ฉด์ ๋์ด, ๋ฒฝ๋์ ๋์ด ๊ทธ๋ฆฌ๊ณ ๋ฌด๊ฒ๊ฐ ์ฐจ๋ก๋๋ก ์์ ์ ์๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ๋ฒฝ๋์ ์
๋ ฅ๋๋ ์์๋๋ก 1๋ถํฐ์ฐ์์ ์ธ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ค.
โฃ ์ถ๋ ฅ์ค๋ช
์ฒซ ๋ฒ์งธ ์ค์ ๊ฐ์ฅ ๋์ด ์์ ์ ์๋ ํ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
โฃ ์
๋ ฅ์์ 1
5
25 3 4
4 4 6
9 2 3
16 2 5
1 5 2
โฃ ์ถ๋ ฅ์์ 1
10
import sys
# sys.stdin = open("input.text", "rt")
#๊ฐ์ฅ ๋์ ํ ์๊ธฐ
#๋ฐ๋ฉด ๋์ด, ๋ฒฝ๋ ๋ฌด๊ฒ๊ฐ ์กฐ๊ฑด
#์๋ก ๊ฐ์๋ก ๋์ด ์ข๊ณ ๋ฌด๊ฒ ๊ฐ๋ฒผ์์ผ ํ๋ค
n = int(input())
data = []
for _ in range(n):
a,b,c = map(int, input().split()) #๋ฐ๋ฉด ๋์ด, ๋ฒฝ๋ ๋์ด, ๋ฌด๊ฒ
data.append((a,b,c))
data.sort() #๋ฐ๋ฉด ๋์ด๋ก ์ค๋ฆ์ฐจ์ -> ์กฐ๊ฑด ํ๋ ์ ์ธ
#์ด์ ๋ฒฝ๋ ๋ฌด๊ฒ๋ง ๋ค๋ก ๊ฐ์๋ก ์ฆ๊ฐ. ์ฆ ์ต์ฅ ๋ถ๋ถ ์ฆ๊ฐ์์ด!
dp = [0] * n #๊ฐ ์ธ๋ฑ์ค ๊ฐ๊น์ง์ ์ต๋ ์ธ์ธ ์ ์๋ ๊ฐ์
dp[0] = data[0][1]
for i in range(1,n):
h = 0
for j in range(i):
if data[j][2] < data[i][2] and dp[j] > h:
h = dp[j] #์ด์ ๊น์ง์ ์ต์ฅ๋์ด๋ฅผ ์ ์ฅํด๋์
dp[i] = h + data[i][1]
print(max(dp))
์กฐ๊ฑด์ด ๋๊ฐ์ง์๋ค. ๋ฒฝ๋์ ๋ฐ๋ฉด ๋์ด, ๋ฒฝ๋์ ๋ฌด๊ฒ.
๋จผ์ ๋ ์ค ํ๋์ ์กฐ๊ฑด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ผ๋ง ํ๋ค. ์กฐ๊ฑด์ด ๋๊ฐ๋ผ ํ๋๋ ๊ณ ์ ์ ์์ผ์ฃผ๊ณ ๋๋จธ์ง ํ๋๋ฅผ ๋์กฐํ๋ฉด์ ํ์์ด์ผ ํ์ด