[알고리즘] LIS(Longest Increasing Subsequence)
LIS(Longest Increasing Subsequence_가장 긴 증가하는 부분 수열)이란?
백준의 다음 문제를 가지고 LIS를 정리해보자 ---> www.acmicpc.net/problem/11053
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 찾아야한다.
예를 들어, A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50}이고, 길이는 4이다.
DP를 이용하여 풀 수 있다. DP 배열에는 해당 인덱스까지의 최대 길이를 저장한다.
먼저 첫 번째 인덱스에서는 당연히 자기 자신밖에 없기 때문에 최장 길이가 1이다.
두 번째 인덱스를 보면, 해당 값이 이전의 값보다 크기 때문에 이전 인덱스의 DP 배열의 값 + 1을 해준다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
int N = Integer.parseInt(br.readLine());
int[] arr = Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt)
.toArray();
int[] dp = new int[N];
dp[0] = 1;
for (int i = 1; i < N; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[i] > arr[j] && dp[i] <= dp[j]) {
dp[i] = dp[j] + 1;
}
}
}
int max = 0;
for (int i : dp) {
max = Math.max(max, i);
}
System.out.println(max);
} catch (Exception ex) {
ex.getMessage();
}
}
}
'Algorithm > Theory' 카테고리의 다른 글
[알고리즘] KMP(Knuth-Morris-Pratt) 알고리즘 (0) | 2021.03.10 |
---|---|
[알고리즘] 세그먼트 트리 (SegmentTree) (0) | 2021.03.05 |
[알고리즘] 슬라이딩 윈도우(Sliding Window) 알고리즘 (0) | 2020.10.31 |
[알고리즘] 투 포인터(Two Pointers) 알고리즘 (0) | 2020.10.26 |
[알고리즘] 최단 경로 - 벨만 포드 알고리즘 (0) | 2020.10.25 |
댓글
이 글 공유하기
다른 글
-
[알고리즘] KMP(Knuth-Morris-Pratt) 알고리즘
[알고리즘] KMP(Knuth-Morris-Pratt) 알고리즘
2021.03.10 -
[알고리즘] 세그먼트 트리 (SegmentTree)
[알고리즘] 세그먼트 트리 (SegmentTree)
2021.03.05 -
[알고리즘] 슬라이딩 윈도우(Sliding Window) 알고리즘
[알고리즘] 슬라이딩 윈도우(Sliding Window) 알고리즘
2020.10.31 -
[알고리즘] 투 포인터(Two Pointers) 알고리즘
[알고리즘] 투 포인터(Two Pointers) 알고리즘
2020.10.26