Learning
토픽 71 / 82

LIS (최장 증가 부분 수열, Longest Increasing Subsequence)

LIS (최장 증가 부분 수열, Longest Increasing Subsequence)

주어진 수열에서 원소의 순서를 유지하면서 값이 증가하는 가장 긴 부분 수열을 찾는 문제로, DP O(n²) 또는 이분 탐색 O(n log n)으로 해결

목적: 부분 수열 최적화, 정렬 관련 문제, DP 학습

특징: 부분 수열(연속 아님), 순서 유지, 증가 조건, DP 대표 문제

예시: [10, 20, 10, 30, 20, 50] → LIS = [10, 20, 30, 50], 길이 = 4

DP 풀이 O(n²)

  • dp[i] = arr[i]로 끝나는 LIS 길이
  • dp[i] = max(dp[j] + 1) for all j < i where arr[j] < arr[i]
  • 초기값: dp[i] = 1 (자기 자신만)
  • 답: max(dp[i])

이분 탐색 풀이 O(n log n)

  • tail[i] = 길이 i+1인 LIS의 마지막 원소 중 최솟값
  • 각 원소에 대해 이분 탐색으로 tail 갱신
  • tail 배열은 항상 정렬 상태 유지
  • 답: tail 배열의 길이

동작(이분 탐색)

시간 복잡도: DP O(n²), 이분 탐색 O(n log n)

공간 복잡도: O(n)

LIS 복원: 이분 탐색에서 parent 배열로 역추적

장점: DP 기초 문제, 다양한 응용, 효율적 풀이 가능

단점: 실제 수열 복원 추가 작업 필요

적용사례: 박스 쌓기, 스케줄링, 최장 체인, 러시안 인형

비교: LIS(증가) vs LCS(공통) vs LDS(감소)

연관: 동적 프로그래밍, 이분 탐색, 부분 수열, 최적화