본문 바로가기
백준(Java)/23년 8월

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

by C0MPAS 2023. 8. 21.

8월 21일(월) - 다이나믹 프로그래밍 (11054번)

 

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

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

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

import java.util.StringTokenizer;

public class Main {

    static int N;
    static int[] arr;
    static int[] left_dp;
    static int[] right_dp;
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        left_dp = new int[N];
        right_dp = new int[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++)
        {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        for(int i=0; i<N; i++)
        {
            left_dp[i] = 1;

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

        for(int i=N-1; i>=0; i--)
        {
            right_dp[i] = 1;

            for(int j=N-1; j>i; j--)
            {
                if(arr[i] > arr[j])
                {
                    right_dp[i] = Math.max(right_dp[i], right_dp[j] + 1);
                }
            }
        }

        int max = 0;
        for(int i=0; i<N; i++)
        {
            int sum = left_dp[i] + right_dp[i] - 1;
            if(sum > max)
            {
                max = sum;
            }
        }

        System.out.println(max);
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

댓글