[알고리즘] 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
댓글을 사용할 수 없습니다.