import java.util.Scanner;
/**
* 시간복잡도(N ^ 2)
* @author mingggkeee
*
*/
public class DP_LIS {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 수열의 크기
int[] arr = new int[N]; // 수열의 원소 저장
int[] LIS = new int[N]; // 자신을 끝으로 하는 LIS길이
for(int i=0; i<N; i++) {
arr[i] = sc.nextInt();
}
int max = 0; // LIS 최장길이 저장
// 모든 원소에 대해 자신을 끝으로 하는 LIS 길이 계산
for(int i=0; i<N; i++) {
LIS[i] = 1; // 나 혼자 LIS일 때 1이니까 1로 초기화
// 첫 원소부터 i원소 직전까지 비교
for(int j=0; j<i; j++) {
// 증가수열의 모습 확인
if(arr[j] < arr[i] && LIS[i] < LIS[j]+1) {
LIS[i] = LIS[j]+1;
}
}
if(max<LIS[i]) {
max = LIS[i];
}
}
System.out.println(max);
sc.close();
}
}
설명이 너무 어렵다...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* O(NlogN)
* @author mingggkeee
*
*/
public class BinarySearch_LIS {
static int[] memo;
static int INF = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] nums = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
memo = new int[N+1];
int len = 0;
int idx = 0;
for(int i=0; i<N; i++) {
if(nums[i] > memo[len]) {
len += 1;
memo[len] = nums[i];
} else {
idx = binarySearch(0, len, nums[i]);
memo[idx] = nums[i];
}
}
System.out.println(len);
}
static int binarySearch(int left, int right, int target) {
int mid = 0;
while(left<right) {
mid = (left+right)/2;
if(memo[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
}