https://www.acmicpc.net/problem/2631
코드설명
DP 문제 중에서 LIS 문제입니다.
LIS 는 Longest Increasing Subsequence 로써, 가장 증가하는 부분수열을 의미합니다.
문제 예시와 함께 설명해보겠습니다.
입력
7
3
7
5
2
6
1
4
출력
4
주어진 입력
3 7 5 2 6 1 4
LIS DP 배열 값
1 2 2 1 3 1 2
3 5 6 일때 가장 증가하는 부분수열입니다.
이곳에서 7과 2 1 4 를 움직이게하면, 1 2 3 4 5 6 7 을 최소한의 숫자로 구할 수 있습니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N, M;
public static int answer = 0;
public static int[] arr;
public static int[] dp;
public static int max = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new int[N+1];
dp = new int[N+1];
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
arr[i] = Integer.parseInt(st.nextToken());
}
for(int i=0;i<N;i++) {
dp[i] = 1;
for(int j=0;j < i; j++) {
if(arr[i] > arr[j]) {//만약 현재보다 크다면, 해당 dp값과 현재 dp값을 비교하여 더 큰값으로 갱신한다.
dp[i] = Math.max(dp[i], dp[j] + 1);
max = Math.max(max, dp[i]);
}
}
}
System.out.println(N - max);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1520 내리막 길 - 재귀(DFS) + DP JAVA (0) | 2023.11.03 |
---|---|
[백준] 2056 작업 - 위상정렬 Topology Sort JAVA (0) | 2023.10.31 |
[백준] 1915 가장 큰 정사각형 - DP JAVA (0) | 2023.10.29 |
[백준] 14567 선수과목 (Prerequisite) - 위상정렬(Topology Sort) JAVA (0) | 2023.10.28 |
[백준] 5557 1학년 - DP JAVA (0) | 2023.10.27 |