ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)11054 - 가장 긴 바이토닉 부분 수열
    PS/boj 2020. 9. 20. 20:29
    import java.io.*;
    import java.util.StringTokenizer;
    
    public class Main {
        static int[] d;
        static int[] dl;
        static int[] dr;
        static int[] val;
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
        public static void main(String[] args) throws IOException {
            int n = Integer.parseInt(br.readLine());
            d = new int[n+1]; dl = new int[n+1]; dr = new int[n+1];
            val = new int[n+1];
    
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int i = 1; i <= n; i++) {
                val[i] = Integer.parseInt(st.nextToken());
            }
    
            // dl : i를 마지막으로하는 증가하는 부분 수열의 길이
            for (int i = 1; i <= n; i++) {
                dl[i] = 1;
                for (int j = 1; j <= i; j++) {
                    if (val[j] < val[i] && dl[i] < dl[j] + 1) {
                        dl[i] = dl[j] + 1;
                    }
                }
            }
    
            // dr : i를 시작으로하는 감소하는 부분 수열의 길이
            for (int i = n; i >= 1; i--) {
                dr[i] = 1;
                for (int j = i+1; j <= n; j++) {
                    if (val[j] < val[i] && dr[i] < dr[j] + 1) {
                        dr[i] = dr[j] + 1;
                    }
                }
            }
    
            // d = dl + dr - 1;
            for (int i = 1; i <= n; i++) {
                d[i] = dl[i] + dr[i] - 1;
            }
    
            int ans = 0; // 최댓값
            for (int i = 1; i <= n; i++) {
                if (ans < d[i]) ans = d[i];
            }
    
            System.out.println(ans);
        }
    }
    

     

    - 풀이법도 생각하고 거의 정답에 근접했는데 못 풀었다.

    - i가 시작인 감소하는 부분수열에서 막혔다.

    - 분명히 풀었던 문제인데 안되니까 답답하다,, 

    - 주말엔 풀었던 문제를 다시 보자.

     

     

    - d[i] = i가 Sk 일때의 바이토닉 수열의 길이라고 점화식 세움

    - i가 Sk일경우 i가 마지막인 증가하는 부분 수열의 길이 , i가 시작인 감소하는 부분 수열의 길이와 같다.

    - d[i] = dl[i] + dr[i] -1 ; i가 두 번 중복되니 마지막에 -1

    - ans는 d[] 에서 최댓값

     

     

    'PS > boj' 카테고리의 다른 글

    boj)2133 - 타일 채우기  (0) 2020.09.21
    boj)13398 - 연속합 2  (0) 2020.09.21
    boj)11722 - 가장 긴 감소하는 부분 수열  (0) 2020.09.20
    boj)11055 - 가장 큰 증가 부분 수열  (0) 2020.09.19
    boj)1932 - 정수 삼각형  (0) 2020.09.19
킹수빈닷컴