[Gold IV] 가장 긴 바이토닉 부분 수열 - 11054
성능 요약
메모리: 12540 KB, 시간: 120 ms
분류
다이나믹 프로그래밍
제출 일자
2023년 11월 25일 11:16:22
문제 설명
수열 S가 어떤 수 Sk를 기준으로 S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN을 만족한다면, 그 수열을 바이토닉 수열이라고 한다.
예를 들어, {10, 20, 30, 25, 20}과 {10, 20, 30, 40}, {50, 40, 25, 10} 은 바이토닉 수열이지만, {1, 2, 3, 2, 1, 2, 3, 2, 1}과 {10, 20, 30, 40, 20, 30} 은 바이토닉 수열이 아니다.
수열 A가 주어졌을 때, 그 수열의 부분 수열 중 바이토닉 수열이면서 가장 긴 수열의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 부분 수열 중에서 가장 긴 바이토닉 수열의 길이를 출력한다.
풀이 방법
1. DP를 사용한 배열을 두개 만들어준다.(오름차순 정렬DP, 내림차순 정렬DP)
2. 오름차순을 사용한 배열
1 | 5 | 2 | 1 | 4 | 3 | 4 | 5 | 2 | 1 |
1 | 2 | 2 | 1 | 3 | 3 | 4 | 5 | 2 | 1 |
3. 내림차순을 사용한 배열
1 | 5 | 2 | 1 | 4 | 3 | 4 | 5 | 2 | 1 |
1 | 5 | 2 | 1 | 4 | 3 | 3 | 3 | 2 | 1 |
4. 구한 두가지 배열을 합쳐준다.(오름차순과 내림차순이 합쳐진 배열을 만듬)
5. 각 원소가 1개씩 중복이므로 1씩 빼서 계산하면 됨
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] nums = new int[n];
int[] rDp = new int[n];
int[] dp = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(st.nextToken());
}
// 오름차순 배열
for (int i = 0; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j] && dp[j] + 1 > dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
// 내림차순 배열
for (int i = n - 1; i >= 0; i--) {
rDp[i] = 1;
for (int j = n - 1; j >= 0; j--) {
if (nums[i] > nums[j] && rDp[j] + 1 > rDp[i]) {
rDp[i] = rDp[j] + 1;
}
}
}
// 각 배열을 합쳐준다. 1을 빼는 이유는 원소가 1개씩 겹치기 때문에
int max = 0;
for (int i = 0; i < n; i++) {
max = Math.max(max, dp[i] + rDp[i]);
}
System.out.println(max - 1);
}
}
'알고리즘 - Baekjoon > Gold' 카테고리의 다른 글
[백준] 11729번 : 하노이 탑 이동 순서 Gold5(골드5) - JAVA[자바] (1) | 2023.11.26 |
---|---|
[백준] 12851번 : 숨바꼭질2 Gold4(골드4) - JAVA[자바] (0) | 2023.11.25 |
[백준] 9251번 : LCS Gold5(티어) - JAVA[자바] (1) | 2023.11.24 |
[백준] 12886번 : 돌 그룹 Gold5(골드 5) - JAVA[자바] (1) | 2023.11.21 |
[백준] 16928번 : 뱀과 사다리 게임 Gold5(골드 5) - JAVA[자바] (0) | 2023.11.17 |