[ 문제 ]
수열 가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 = { } 인 경우에 가장 긴 증가하는 부분 수열은 = { } 이고, 길이는 4이다.
package binary_search;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class bj12015 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N;
static int [] A;
static int [] tmp;
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
A = new int[N];
tmp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < N ; i ++){
A[i] = Integer.parseInt(st.nextToken());
}
int flag = 0;
tmp[flag] = A[0];
for(int i = 1 ; i < N ; i ++){
if(tmp[flag] < A[i]){
tmp[++flag] = A[i];
} else {
int curloc = findloc(flag, A[i]);
tmp[curloc] = A[i];
}
}
System.out.println(flag + 1);
}
private static int findloc(int end, int n){
int lo = 0;
while(lo < end){
int mid = (lo + end) / 2;
if(tmp[mid] >= n){
end = mid;
} else {
lo = mid + 1;
}
}
return lo;
}
}