juwanseo 2025. 4. 10. 18:29
d[i] : 0 ~ i까지 i를 포함하는 최장 증가 수열의 길이 저장 리스트

a[i] 를 i번째 수열의 값
d[k] : a[i] > a[k]를 만족하는 최대 수열의 길이
a[i]보다 작은 값을 지니고 있는 수열의 최장 증가 수열의 길이들 중 최댓값을 찾아 해당 값 +1한 값을 d[i]에 저장

<점화식>
d[i] = max({d[k]}) +1 (k: 1 ~ i-1)

<슈도 코드>
n(수열 길이(개수))
a(수열 데이터 저장 리스트)
maxLength(가장 긴 증가하는 부분 수열 길이 저장)
b[] (현재 가장 유리한 증가 수열 저장 리스트)
d[] (0 ~ i까지 i를 포함하는 최장 증가 수열의 길이 저장 리스트)
ans[] (정답 수열 저장 리스트)

#바이너리 서치 구현
binarysearch(l,r,now): #현재 수열이 들어갈 수 있는 위치를 빠르게 찾기 위한 함수
    while l이 r보다 작을 때까지 반복:
        중앙값 = l + r / 2
        b[중앙값]이 now보다 작으면 l값을 중앙값 +1로 변경
        b[중앙값]이 now보다 크거나 같으면 r값을 중앙값으로 변경
    l값을 리턴
for i -> 2 ~ n:
    if 가장 마지막 수열보다 현재 수열이 클 때:
        b 리스트의 끝에 a[i]값 추가하기
        maxLength = ??
        d 리스트에 ??
    else:
        바이너리 서치를 이용해 현재 수열이 들어갈 index 찾기
        b[index] = 현재 수열의 값을 저장
        d[i] = index




-------------------------------
import sys
input = sys.stdin.readline

n = int(input())

arr = list(map(int,input().split()))

maxLength = 0
b = []
d = []
ans = []