百準14003成長最長の部分数列5
質問する
https://www.acmicpc.net/problem/14003
コード#コード#
n = int(input())
arr = list(map(int, input().split()))
dp = [arr[0]]
index = [1]
for i in range(1, n):
if dp[-1] < arr[i]:
dp.append(arr[i])
index.append(len(dp))
else:
low = 0
high = len(dp)-1
idx = 0
while low <= high:
mid = (low+high)//2
if dp[mid] >= arr[i]:
idx = mid
high = mid-1
elif dp[mid] < arr[i]:
low = mid+1
else:
dp[idx] = arr[i]
index.append(idx+1)
temp = len(dp)
print(temp)
result = []
for i in range(len(index)-1, -1, -1):
if temp == index[i]:
result.append(arr[i])
temp -= 1
print(*list(reversed(result)))
に答える
dp問題で最も長い部分数列を増やし,この検索を用いてO(nlogn)内で問題を解くとタイムアウトしない.
dpテーブルには、現在の最長増分部分列の最小値が格納されます.
配列値を格納するインデックスを個別に計算し,一部の数列を出力した.
Reference
この問題について(百準14003成長最長の部分数列5), 我々は、より多くの情報をここで見つけました https://velog.io/@josajang98/백준-14003-가장-긴-증가하는-부분-수열-5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol