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);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(Java) > 23년 8월' 카테고리의 다른 글
[Java] 백준 - 1049번: 기타줄 (0) | 2023.08.23 |
---|---|
[Java] 백준 - 1927번: 최소 힙 (0) | 2023.08.22 |
[Java] 백준 - 11403번: 경로 찾기 (0) | 2023.08.18 |
[Java] 백준 - 11725번: 트리의 부모 찾기 (0) | 2023.08.17 |
[Java] 백준 - 1439번: 뒤집기 (0) | 2023.08.16 |
댓글