https://www.acmicpc.net/problem/1965
사용한 알고리즘 : DP
난이도 : 실버 2
앞의 상자의 크기가 뒤의 상자의 크기보다 작을 때, 앞의 상자를 뒤에 상자 안에 넣을 수 있다.
상자의 순서와 갯수가 주어질때, 한 번에 넣을 수 있는 최대의 상자 개수를 구하시오.
DP 알고리즘으로 문제를 해결하기 위해서는 다음의 2 조건을 만족해야한다.
1. 큰 문제를 같은 구조의 작은 문제로 분해할 수 있다.
2. 작은 문제의 최적의 해를 이용해서 큰 문제의 최적의 해를 구할 수 있다.
위의 두 경우를 만족하면 문제를 점화식의 형태로 만들어 풀 수 있다.
점화식
package Java.Y22.M03.D04;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ1965_BoxInBox {
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int[] dp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
dp[i] = 0;
}
int answer = 0;
for(int i = 1; i < N; i++) {
for(int j = 0; j < i; j++) {
if(arr[i] <= arr[j]) continue;
if(dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
}
}
if(dp[i] > answer) answer = dp[i];
}
System.out.println(answer + 1);
}
}