티스토리 뷰

https://www.acmicpc.net/problem/11054

 

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

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

www.acmicpc.net

유형 : DP

접근 :

  • i번째 수를 기준으로 봤을 때 1 -> i-1 까지의 수 중 i번째 수보다 작은 수들의 dp값 + 1 저장
  • i번째 수를 기준으로 봤을 때 i+1 -> n까지의 수중 i번째 수보다 작은 수들의 dp값 + 1 저장

가장 증가하는 부분 수열 (LIS)를 왼쪽과 오른쪽을 기준으로 2번 구해서 값을 구하면 된다.

 

전체 코드

import java.util.*;
import java.io.*;

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

        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine()," ");

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

        int[] left = new int[n+1];
        for(int i=1;i<=n;i++){

            int max = 0;
            for(int j=i-1;j>=1;j--){

                if(arr[i] > arr[j])
                    max = Math.max(left[j] + 1 , max);
            }

            left[i] = max;
        }

        int[] right = new int[n+1];
        for(int i=n;i>=1;i--){

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

            right[i] = max;
        }

        int max = 0;
        for(int i=1;i<=n;i++){
            max = Math.max(max , left[i] + right[i]);
        }

        System.out.println(max+1);
        br.close();
    }
}

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

백준 10653 (마라톤 2) - java  (0) 2023.09.07
백준 17780 (새로운 게임) - java  (0) 2023.09.05
백준 3184 (양) - java  (0) 2023.08.29
백준 11403 (경로 찾기) - java  (1) 2023.08.29
백준 14938 (서강그라운드) - java  (0) 2023.08.23