[BaekJoon] 11054번 가장 긴 바이토닉 부분 수열 (Java) 문제 풀이 [Gold 4]
문제
https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
어떻게 풀 것인가?
LIS와 LDS의 혼합 문제였다.
처음에 LIS를 시행이후에 LDS를 시행하면 문제가 원하는 최장 바이토닉 수열의 길이가 나온다.
간단했다.
아래는 LIS 와 LDS의 정리글이다.
https://superohinsung.tistory.com/199
[Algorithm] LIS, LDS (최장 증가 부분 수열, 최장 감소 부분 수열)
최장 증가 부분 수열(LIS, Longest Increasing Subsequence) 최장 증가 부분 수열(LIS, Longest Increasing Subsequence)은 주어진 수열에서 요소들이 증가하는 순서대로 선택되는 가장 긴 부분 수열을 말한다. 즉, 주
superohinsung.tistory.com
풀면서 놓쳤던점
LIS와 LDS에 대한 개념 접근을 처음에는 까먹고 있어서 조금 헤맸다.
시간이 된다면 블로그에 정리했던 알고리즘들을 다시 공부해야할 것 같다.
이 문제를 통해 얻어갈 것
LIS, LDS에 대한 개념
내 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준알고리즘 11054번 가장 긴 바이토닉 부분 수열
public class Main {
static int N;
static int[] arr;
static int[] Rdp;
static int[] Ldp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
arr = new int[N];
Rdp = new int[N];
Ldp = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
LIS();
LDS();
int max = 0;
for (int i = 0; i < N; i++) {
max = Math.max(Rdp[i] + Ldp[i], max);
}
System.out.println(max - 1);
}
static void LIS() {
for (int i = 0; i < N; i++) {
Rdp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i] && Rdp[i] < Rdp[j] + 1) {
Rdp[i] = Rdp[j] + 1;
}
}
}
}
static void LDS() {
for (int i = N - 1; i >= 0; i--) {
Ldp[i] = 1;
for (int j = N - 1; j > i; j--) {
if (arr[j] < arr[i] && Ldp[i] < Ldp[j] + 1) {
Ldp[i] = Ldp[j] + 1;
}
}
}
}
}
참고
[알고리즘/Algorithm] LIS, LDS
길이가 n인 배열(리스트)의 일부 원소를 골라서 만든 부분 수열 중, 각 원소의 크기가 이전 원소의 크기보다 크다는 조건을 만족할 때 길이가 가장 긴 부분 수열을 최장 증가 부분 수열(LIS)이다.ar
velog.io