최장 증가 수열 : 가장 긴 증가하는 부분 수열
다음과 같은 수열이 있다면, 가장 긴 증가하는 부분 수열(LIS)는 10, 20, 50, 90
또는 10, 20, 40, 60
이다.
dp[i]
= i보다 앞에 있는 작은 수(j
=i-1
~0
) 중 가장 큰 값을 가지는 dp[j]
+ 1
O(N^2)
int arr[] = {7, 2, 3, 8, 4, 5};
int dp[] = new int[arr.length];
for(int i = 1; i < dp.length; i++) {
for(int j = i-1; j>=0; j--) {
if(arr[i] > arr[j]) {
dp[i] = (dp[i] < dp[j]+1) ? dp[j]+1 : dp[i];
}
}
}
for (int i = 0; i < dp.length; i++) {
if(max < dp[i]) max = dp[i];
}
// 저장된 dp 배열 값 : [0, 0, 1, 2, 2, 3]
// LIS : dp배열에 저장된 값 중 최대 값 + 1
Lower Bound란 정렬된 배열에서 찾고자 하는 값 이상이 처음으로 나타나는 위치를 말한다.
처음으로 나타나는 자신보다 큰값
or 자신보다 큰 값들중 가장 작은 값
O(NlogN)
https://source-sc.tistory.com/15?category=882382 (lower bound 방식)
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jh20s&logNo=221310955726 (dp + lower bound)