백준 11054번 - 가장 긴 바이토닉 부분 수열

장근영·2024년 6월 23일
0

BOJ - DP

목록 보기
4/38

문제

백준 11054번 - 가장 긴 바이토닉 부분 수열


아이디어

  • dp[n]을 n번째 자리에서 가장 긴 바이토닉 부분수열의 길이라고 가정한다.
  • 정방향과 역방향을 각각 구한다.
  • n번째 자리의 합 중 최댓값 - 1 이 정답이다.
  • -1 은 교집합 부분을 제외한 것이다.

예상 시간 복잡도

  • 이중 for문으로 정방향과 역방향 DP 배열 구함
  • 예상 시간 복잡도 : O(N^2)

코드 구현

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_11054 {
    public static void main(String[] args) throws IOException {
    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n]; //수열
        int[] dp = new int[n];  //정방향 바이토닉 수열
        int[] dp_r = new int[n];//역방향 바이토닉 수열

        StringTokenizer st = new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            dp[i] = 1;
            dp_r[i] = 1;
        }

        //정방향
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                if (arr[i] > arr[j] && dp[i] + 1 == dp[j] + 1) {
                    dp[i] = dp[j] + 1;
                }
            }
        }

        //역방향
        for (int i = n - 2; i >= 0; i--) {
            for (int j = n - 1; j >= i; j--) {
                if (arr[i] > arr[j] && dp_r[i] + 1 == dp_r[j] + 1) {
                    dp_r[i] = dp_r[j] + 1;
                }
            }
        }

        int max = 0;

        for (int i = 0; i < n; i++) {
            max = Math.max(max, dp[i] + dp_r[i]);
        }

        System.out.println(max - 1);
    }
}

profile
오늘 할 일을 내일로 미루지 말자.

0개의 댓글