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

<아이디어>
결국은 가장 긴 오름차순 수열과 가장 긴 내림차순 수열.
근데 이제 오름차순의 끝나는 수와 내림차순의 시작하는 수가 동일할 때의 최대 길이를 구하는 문제이다.
1. 가장 긴 증가하는 부분 수열을 찾아 dpUp배열에 저장한다.
2. 가장 긴 감소하는 부분 수열을 찾아 dpDown배열에 저장한다. (이때 배열의 끝부터 역으로 오름차순 탐색했다.)
3. 각 위치에서 dpUp + dpDown - 1 (현재 위치 수 중복) 을 계산하며 최댓값을 갱신한다.
<제출코드>
package Study.Week05;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Day32_BOJ_11054_가장긴바이토닉부분수열 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
// 가장 긴 증가하는 부분 수열
int[] dpUp = new int[n];
Arrays.fill(dpUp, 1);
for(int i=0; i<n; i++){
for(int j=0; j<i; j++){
if(arr[j] < arr[i]) dpUp[i] = Math.max(dpUp[i], dpUp[j]+1);
}
}
// 가장 긴 감소하는 부분 수열 찾기
int[] dpDown = new int[n];
Arrays.fill(dpDown, 1);
for(int i=n-1; i>=0; i--){
for(int j=n-1; j>i; j--){
if(arr[j] < arr[i]) dpDown[i] = Math.max(dpDown[i], dpDown[j]+1);
}
}
// 가장 긴 길이 찾기
int ans = 0;
for(int i=0; i<n; i++){
ans = Math.max(ans, dpUp[i] + dpDown[i] - 1);
}
System.out.println(ans);
}
}
'코테 > 백준' 카테고리의 다른 글
[BOJ] 2170 선 긋기 (Java) (0) | 2024.12.08 |
---|---|
99클럽 코테 스터디 35일차 TIL 구현(주사위 윷놀이) (1) | 2024.12.02 |
99클럽 코테 스터디 31일차 TIL DP(줄세우기) (0) | 2024.11.27 |
[BOJ] 12852 1로 만들기 2 (Java) (0) | 2024.11.26 |
99클럽 코테 스터디 30일차 TIL DP(상자넣기) (0) | 2024.11.26 |