문제 링크 - https://www.acmicpc.net/problem/11053
🌱 문제

🌱 풀이과정
- 싸피 알고리즘 강의중 LIS 관련 내용을 복습하면서 풀어보았다.
LIS 알고리즘 - DB 이용
- 시간복잡도: 약
O(N^2)
(정확히 따지자면 1+2+3+...+N = (N-1)*N/2의 시간복잡도를 가진다.)
- 자세한 풀이는 주석 참고
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int arr[];
static int cnt[];
static int answer;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N=Integer.parseInt(br.readLine());
arr=new int[N];
cnt=new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
arr[i]=Integer.parseInt(st.nextToken());
}
int temp=0;
for(int i=0; i<N; i++) {
cnt[i]=1;
for(int j=0; j<i; j++) {
if(arr[j]<arr[i] && cnt[i]<cnt[j]+1)
cnt[i]=cnt[j]+1;
}
answer=Math.max(answer, cnt[i]);
}
System.out.println(answer);
}
}
DP와 이분탐색 이용
- 시간복잡도:
O(NlogN)
- 자세한 풀이는 주석 참고
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr= new int[n];
int[] dp = new int[n];
for(int i=0; i<n; i++) {
arr[i]=Integer.parseInt(st.nextToken());
}
int size=0;
for(int i=0; i<n; i++) {
int x= Arrays.binarySearch(dp, 0, size, arr[i]);
if(x>=0) continue;
int index=Math.abs(x)-1;
dp[index]=arr[i];
if(index==size) size++;
}
System.out.println(size);
}
}