목차

가장 긴 증가하는 부분 수열 (Longest Increasing Subsequence / LIS)

LIS의 길이 구하기

나이브 DP

세그트리를 이용한 최적화

이진탐색을 이용한 최적화

def lis_length_v1(seq) -> int:
    arr = []
    for val in seq:
        pos = bisect.bisect_left(arr, val)
        if pos == len(arr):
            arr.append(val)
        else:
            arr[pos] = val
    return len(arr)

def lis_length_v2(seq) -> int:
    arr = [seq[0]]
    for val in seq:
        if val > arr[-1]:
            arr.append(val)
        else:
            arr[bisect.bisect_left(arr, val)] = val
    return len(arr)

Longest non-decreasing subsequence, Longest decreasing subsequence

LIS 복원하기

관련 문제

관련 성질

활용

정렬 문제

LIS의 갯수를 구하기

2-element tuple

3-element tuple

최소 갯수의 non-increasing subsequence 로 배열을 커버하기