LIS(Longest Increasing Subsequence)를 학습할 수 있는 웰-노운 DP 문제다! [실버2]
https://www.acmicpc.net/problem/11053
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
예제 입력 1
6
10 20 10 30 20 50
예제 출력 1
4
우선, 입력 제한값이 1000이므로 O(N^2) 시간 복잡도 안으로 풀기만 하면 된다
(답안 코드)
import java.io.*;
import java.util.*;
// LIS(Longest Increasing Subsequence): 웰-노운 DP 문제
public class Main {
private static int[] arr;
private static int[] dp; // i번째 숫자를 마지막으로 갖는 LIS 길이
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
arr = new int[N];
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] = 1; // 기본적으로 각 원소는 LIS의 최소 길이 1을 가지게 설정
}
System.out.println(dp(N));
br.close();
}
private static int dp(int N) {
int maxLIS = 1;
for (int i = 1; i < N; i++) { // 현재 위치 i
for (int j = 0; j < i; j++) { // 0 ~ (i - 1)까지 비교
if (arr[j] < arr[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
maxLIS = Math.max(maxLIS, dp[i]);
}
return maxLIS;
}
}
/*
7
1 2 1 5 3 4 6
5
*/
7
1 2 1 5 3 4 6
입력에 대한 그림
#SK, #SKALA, #SKALA1기
'problem solving > ps java' 카테고리의 다른 글
[ps java] BOJ 9251 LCS 해설 (1) | 2025.03.18 |
---|---|
[ps java] BOJ 9465 스티커 해설 (0) | 2025.03.17 |
[ps java] BOJ 1149 RGB 거리 해설 (1) | 2025.01.31 |
[ps java] BOJ 1912 연속합 해설 (카데인 알고리즘) (1) | 2025.01.31 |
[ps java] 재귀 -> DP 변환 예시 코드(BOJ 9184) (1) | 2025.01.19 |