Java/Java-1차캐시

[백준] 11054 : 가장 긴 바이토닉 수열

프로버티기 2025. 3. 8. 16:29

문제

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

 

입출력

10
1 5 2 1 4 3 4 5 2 1
7

아이디어

 

- 증가하다가 감소하는 부분 수열 

1) 증가하는 부분 수열 최대 길이 LIS // 왼쪽 부터 

2) 감소하는 부분 수열 최대 길이 LDS // 오른쪽부터 

 

 

코드 

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

public class Main {
	static int N; // 수열A의 크기
	static int[] arr; // 수열

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());

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

		int[] LIS = new int[N]; // 증가하는 부분 수열
		Arrays.fill(LIS, 1);
		for (int i = 1; i < N; i++) {
			for (int j = 0; j < i; j++) { // 앞의 모든 원소와 비교해서 부분 수열을 만듦 N^2
				if (arr[i] > arr[j]) {
					LIS[i] = Math.max(LIS[j] + 1, LIS[i]);
				}
			}
		}

		int[] LDS = new int[N]; // 감소하는 부분 수열
		Arrays.fill(LDS, 1);
		for (int i = N - 2; i >= 0; i--) {
			for (int j = i + 1; j < N; j++) { // 뒤의 모든 원소와 비교해서 부분 수열을 만듦 N^2
				if (arr[i] > arr[j]) {// 뒤의 값 j가 더 작아야 함 (감소)
					LDS[i] = Math.max(LDS[j] + 1, LDS[i]);
				}
			}
		}

		int max = 0;
		for (int i = 0; i < N; i++) {
			max = Math.max(max, LIS[i] + LDS[i] - 1);
		}
		System.out.println(max);

	}
}

'Java > Java-1차캐시' 카테고리의 다른 글

[프로그래머스] 주식가격  (0) 2025.04.07
[백준] 2294 : 동전2  (0) 2025.03.11
[백준] 1043 : 거짓말  (0) 2025.03.06
[백준] 1261 : 알고스팟  (0) 2025.03.04
[백준] 1504 : 특정한 최단 경로  (0) 2025.03.04