[Algorithm]최장증가수열(Longest Increaing Subsequence)
최장증가수열은 가장 긴 증가하는 부분 수열을 찾는 것이다.
예를 들어 수열 A = {10,20,10,30,20,50}인 경우
가장 긴 증가하는 부분 수열은 A = {10,20,10,30,20,50}이고, 길이는 4이다.
👉 LIS는 앞에서부터 뒤로 숫자를 선택하며 부분 수열을 구성해 나갈 때 증가하는 순서대로 숫자를 고르면서 고른 부분 수열의 길이가 최대 길이가 되도록 숫자를 선택하는 것이다.
O(N^2)로 구할 수 있지만, DP를 사용하면 O(NlogN)
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(new InputStreamReader(System.in));
int size = scanner.nextInt();
int[] arr = new int[size];
int[] answer = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = scanner.nextInt();
}
int index = 0;
answer[0] = arr[0];
for (int i = 1 ; i < size; i++){
if (answer[index] < arr[i]){
answer[++index] = arr[i];
}else{
int temp = Arrays.binarySearch(answer, 0, index, arr[i]);
if (temp < 0){
answer[temp * -1 -1] = arr[i];
}else {
answer[temp] = arr[i];
}
}
}
System.out.println(index+1);
}
}