๋ฐฑ์ค 11054 ํ์ด์ฌ
https://www.acmicpc.net/problem/11054
์ด๋ฒ ๋ฌธ์ ๋ ์ด์ ์ ํ์๋ [CS/์๊ณ ๋ฆฌ์ฆ] - ๋ฐฑ์ค 11053 ํ์ด์ฌ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด - ๋์ ๊ณํ๋ฒ, LIS ๋ฌธ์ ์ ์์ฉ์ด๋ค. ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๊ณ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ด๋ค. ์ฆ ์ด์ ์ ํ์๋ LIS ๋ฌธ์ ์์ ๋ฐฐ์ด์ ๊ฐ ์์น์์์ ์ต๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ฃผ์ด์ง ๋ฐฐ์ด๊ณผ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ค์ง์ ๋ฐฐ์ด 2๊ฐ์ง๋ฅผ ๊ตฌํด์ ํด๊ฒฐํ ์ ์๋ค.
Python ํ์ด
import sys
read = sys.stdin.readline
N = int(read())
A = list(map(int, read().split()))
forward = [0] * N
backward = [0] * N
def calc(reverse=False):
if reverse:
temp = [A[-1]]
seq = backward
r = range(N-1, -1, -1)
else:
temp = [A[0]]
seq = forward
r = range(N)
for i in r:
if temp[-1] < A[i]:
temp.append(A[i])
else:
idx = 0
for j in range(len(temp)):
if temp[j] < A[i]:
idx += 1
else:
temp[idx] = A[i]
break
seq[i] = len(temp)
calc()
calc(True)
res = -1
for i in range(N):
res = max(res, forward[i] + backward[i])
print(res-1)
- calc ํจ์๋ LIS๋ฅผ ๊ตฌํ๋ ํจ์์ด๋ค.
- reverse flag๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ๋ค์์๋ถํฐ ์ํํด์ ๊ฐ์ฅ ๊ธด ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ ์ ์๋ค.
- ๊ฐ๊ฐ ์ฆ๊ฐํ๊ณ ๊ฐ์ํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๊ณ ๊ฐ์ ์์น์ ๊ฐ์ ๋ํ ๊ฐ ์ค ์ต๋๊ฐ์ด ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ์์ด์ด ๋๋ค.
- ์์น๊ฐ ๊ฒน์ณ ์ค๋ณต๋๋ 1์ ๋นผ์ค์ผํ๋ค.
๋๊ธ