문제
https://www.acmicpc.net/problem/1965
1965번: 상자넣기
정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가
www.acmicpc.net
풀이
이 문제는 최장 증가 부분 수열(LIS)를 구하는 문제다.
최장 증가 부분 수열은 dp를 이용하여 풀면 O(N^2)의 시간 복잡도가 나온다.(이분탐색을 이용하면 O(nlogn))
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int arr[] = new int[n+1];
int dp [] = new int[n+1];
st = new StringTokenizer(br.readLine());
for(int i=1;i<=n;i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i=1;i<=n;i++) {
dp[i] = 1;
for(int j=1;j<i;j++) {
if(arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
}
Arrays.sort(dp);
System.out.println(dp[n]);
}
}
문제
https://www.acmicpc.net/problem/1965
1965번: 상자넣기
정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가
www.acmicpc.net
풀이
이 문제는 최장 증가 부분 수열(LIS)를 구하는 문제다.
최장 증가 부분 수열은 dp를 이용하여 풀면 O(N^2)의 시간 복잡도가 나온다.(이분탐색을 이용하면 O(nlogn))
코드
import java.util.*; import java.io.*; public class Main { public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; int n = Integer.parseInt(br.readLine()); int arr[] = new int[n+1]; int dp [] = new int[n+1]; st = new StringTokenizer(br.readLine()); for(int i=1;i<=n;i++) { arr[i] = Integer.parseInt(st.nextToken()); } for(int i=1;i<=n;i++) { dp[i] = 1; for(int j=1;j<i;j++) { if(arr[j] < arr[i]) { dp[i] = Math.max(dp[i], dp[j]+1); } } } Arrays.sort(dp); System.out.println(dp[n]); } }