알고리즘/BOJ

[BOJ] 11054. 가장 긴 바이토닉 부분 수열

재담 2022. 2. 23. 00:30

문제 원본 : https://www.acmicpc.net/problem/11054

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        int[] arr = new int[n];
        int[] dp1 = new int[n];
        int[] dp2 = new int[n];

        for (int i = 0; i < n; ++i) {
            arr[i] = scanner.nextInt();
        }

        for (int i = 0; i < n; ++i) {
            dp1[i] = 1;
            dp2[n - i - 1] = 1;
            for (int j = 0; j < i; ++j) {
                if (arr[i] > arr[j]) {
                    dp1[i] = Math.max(dp1[i], dp1[j] + 1);
                }

                if (arr[n - i - 1] > arr[n - j - 1]) {
                    dp2[n - i - 1] = Math.max(dp2[n - i - 1], dp2[n - j - 1] + 1);
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < n; ++i) {
            ans = Math.max(ans, dp1[i] + dp2[i]);
        }

        System.out.println(ans - 1);
    }
}
  • 풀이법이 생각나지 않아 다른 블로그를 참고하였다.
  • 가장 긴 증가하는 부분 수열을 앞에서 한 번, 뒤에서 한 번 적용하면 된다.
  • 각각 구한 배열의 값을 인덱스 별로 더해줘서 나온 가장 큰 값이 답이 된다.
  • 자기 자신은 중복되기 때문에 1을 빼줘야 한다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 5639. 이진 검색 트리  (0) 2022.02.25
[BOJ] 14003. 가장 긴 증가하는 부분 수열 5  (0) 2022.02.24
[BOJ] 1992. 쿼드트리  (0) 2022.02.22
[BOJ] 4949. 균형잡힌 세상  (0) 2022.02.22
[BOJ] 9251. LCS  (0) 2022.02.21