Notice
														
												
											
												
												
													Recent Posts
													
											
												
												
													Recent Comments
													
											
												
												
													Link
													
											
									| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
													Tags
													
											
												
												- 보이는 학생
 - 점수계산
 - Pointer
 - 등수구하기
 - 최대 길이
 - 10991
 - ArrayList
 - 두 배열 합치기
 - Two Pointer
 - 큰 수 출력하기
 - 임시반장 정하기
 - 가장 짧은 문자거리
 - 뒤집은 소수
 - 모든행과열대각선의합
 - 백준
 - 격자판
 - 투 포인터
 - 10992
 - java
 - 공통원소 구하기
 - 아스키코드
 - 누적 계산
 - GitHub #Commit #BaekJoon
 - 코테준비
 - 인프런
 - array
 - 연속부분수열
 - 배열
 - 자바
 - 알고리즘
 
													Archives
													
											
												
												- Today
 
- Total
 
ezhoon
[백준] 11054 가장 긴 바이토닉 부분 수열_Java 본문
📖 문제
⚠️ 주의사항
- LIS 알고리즘을 적용해서 풀어야 한다.
 - 증가하는 경우 감소하는 경우 2가지의 경우를 인지할 것
 
✍️ 이해
**
 * 1. LIS(Longes Increasing Subsequence) 알고리즘 이용
 * 2. 증가하는 경우 / 감소하는 경우 즉 -> <- 이렇게 2개 경우 다 체크해야 한다.
 * 3. dp에 길이 저장 후 2개의 dp의 각 위치의 값을 더하고 그 중에서 max 값을 구한다.
 * 
 * [앞에서부터 증가]
 * [arr]   1 5 2 1 4 3 4 5 2 1
 * [r_dp]  1 2 2 1 3 3 4 5 2 1
 *
 * [뒤에서부터 증가]  
 * [arr]   1 5 2 1 4 3 4 5 2 1
 * [l_dp]  1 5 2 1 4 3 3 3 2 1
 * 
 * [max]
 * [arr]   1 5 2 1 4 3 4 5 2 1
 * [sum]   1 7 4 2 7 5 7 8 4 2
 * 
 * 즉 5를 기준으로 최댓값이 생기게 된다.
 * 왼쪽->오른쪽 : 1, 2, 4, 5
 * 오른쪽->왼쪽 : 5, 2, 1 
 * 즉 5가 겹치게 되기에 이때문에 1을 빼줘야 한다.
 */
✏️ 풀이
public class Main {
    static int N;
    static int[] arr;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        arr = new int[N + 1];
        int[] r_dp = new int[N + 1];
        int[] l_dp = new int[N + 1];
        for (int i = 1; i <= N; i++) arr[i] = sc.nextInt();
        for (int i = 1; i <= N; i++) {
            r_dp[i] = 1;
            for (int j = 1; j < i; j++) {
                dp(r_dp, i, j);
            }
        }
        for (int i = N; i > 0; i--) {
            l_dp[i] = 1;
            for (int j = N; j > i; j--) {
                dp(l_dp, i, j);
            }
        }
        int max = 0;
        for (int i = 1; i <= N; i++) max = Math.max(max, l_dp[i] + r_dp[i]);
        System.out.println(max - 1);
    }
    static void dp(int[] dp, int i, int j) {
        if (arr[i] > arr[j]) {
            dp[i] = Math.max(dp[j] + 1, dp[i]);
        }
    }
}
'[Java] 백준 문제풀이 > DP' 카테고리의 다른 글
| [백준] 2579 계단 오르기_Java (0) | 2022.05.06 | 
|---|---|
| [백준] 1912 연속합_Java (0) | 2022.05.05 | 
| [백준] 11722 가장 긴 감소하는 부분 수열_Java (0) | 2022.05.04 | 
| [백준] 11053 가장 긴 증가하는 부분 수열_Java (0) | 2022.05.03 | 
| [백준] 2156 포도주 시식_Java (0) | 2022.05.02 | 
			  Comments