백준(Java)/23년 8월
[Java] 백준 - 11054번: 가장 긴 바이토닉 부분 수열
C0MPAS
2023. 8. 21. 00:29
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);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ