문제 보기
https://www.acmicpc.net/problem/11054
풀이
증가하는 가장 긴 수열과 감소하는 가장 긴 수열의 합체 버전이라 생각했다.
0번부터 N-1까지 DP를 돌리며 해당 인덱스를 마지막으로 하는 가장 긴 증가 수열을 찾아내고,
N-1번부터 0번까지 DP를 돌리며 해당 인덱스를 처음으로 하는 가장 긴 감소 수열을 찾아냈다.
그리고 0부터 N-1까지 순회를 돌리며 증가 수열 DP + 감소 수열 DP - 1(자기 자신이 중복되기 때문)을 한다.
현재 인덱스를 반환 점으로 생각하는 것이다.
그러면 가장 긴 바이토닉 부분 수열을 찾아낼 수 있게 된다!
전체 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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];
int[] dpDown = new int[N];
for (int i = 0; i < N; i++) {
dpUp[i] = 1;
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
dpUp[i] = Math.max(dpUp[i], dpUp[j] + 1);
}
}
}
for (int i = N - 1; i >= 0; i--) {
dpDown[i] = 1;
for (int j = N - 1; j > i; j--) {
if (arr[j] < arr[i]) {
dpDown[i] = Math.max(dpDown[i], dpDown[j] + 1);
}
}
}
int max = 0;
for(int i = 0; i < N; i++) {
max = Math.max(max, dpUp[i] + dpDown[i] - 1);
}
bw.write(max + "");
bw.flush();
bw.close();
}
}
GitHub 링크
'ProblemSolve > 항해99 코테스터디' 카테고리의 다른 글
99클럽 코테 스터디 34일차 TIL (챌린저): [백준][Java] LCS 3 - 골드5 (0) | 2024.11.30 |
---|---|
99클럽 코테 스터디 33일차 TIL (미들러): [프로그래머스][Java] 신규 아이디 추천 - level 1 (1) | 2024.11.29 |
99클럽 코테 스터디 31일차 TIL (미들러): [백준][Java] 2631 줄세우기 - 골드4 (0) | 2024.11.27 |
99클럽 코테 스터디 30일차 TIL (미들러): [백준][Java] 1965 상자넣기 - 실버2 (0) | 2024.11.26 |
99클럽 코테 스터디 29일차 TIL (챌린저): [백준][Java] 11657 타임머신 - 골드4 (0) | 2024.11.25 |