BaekJoon

[BaekJoon] 11054번 가장 긴 바이토닉 부분 수열 (Java) 문제 풀이 [Gold 4]

Tenacity_Dev 2023. 7. 31. 00:24
728x90

문제

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;
                }
            }
        }

    }
}

 

참고

https://velog.io/@49crehbgr/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-LIS-LDS

 

[알고리즘/Algorithm] LIS, LDS

길이가 n인 배열(리스트)의 일부 원소를 골라서 만든 부분 수열 중, 각 원소의 크기가 이전 원소의 크기보다 크다는 조건을 만족할 때 길이가 가장 긴 부분 수열을 최장 증가 부분 수열(LIS)이다.ar

velog.io

 

728x90