💡Problem Solving/BOJ

[BOJ 11053] 가장 긴 증가하는 부분 수열 (Java)

gom20 2021. 10. 31. 19:45

문제

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

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

 

풀이

DP문제로, Index를 차례대로 증가시키면서 해당 Index 왼편에 올 수 있는 바이토닉 부분 수열의 최대 개수를 구한다. 

이때 기준 Index에서 작은 Index를 체크하면서, 기준보다 작은 수의 바이토닉 수열 최대 개수 중에 최대 값을 구한 후 +1을 해주면 된다. 

아래 문제의 왼쪽 편만 구한 것이다.

2021.10.31 - [Problem Solving/BOJ] - [BOJ 11054] 가장 긴 바이토닉 부분 수열 (Java)

 

[BOJ 11054] 가장 긴 바이토닉 부분 수열 (Java)

문제 https://www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,00..

gom20.tistory.com

 

소스코드

package dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ11053 {

    public static int N;
    public static void pro() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[N+1];
        int[] dp = new int[N+1];
        int totalMax = 0;
        for(int i = 1; i <= N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
            if(i == 1){
                dp[i] = 0;
                totalMax = 1;
                continue;
            }
            int max = 0;
            boolean exist = false;
            for(int j = 1; j < i ; j++){
                if(arr[i] > arr[j]){
                    exist = true;
                    max = Math.max(max, dp[j]);
                }
            }
            dp[i] = exist? max+1 : 0; // i번째 수 왼편에 올 수 있는 바이토닉 부분 수열 원소의 최대 개수 (i번째 수는 미포함!)
            totalMax = Math.max(dp[i]+1, totalMax); // i번째 수를 포함시킨다.
        }

        System.out.println(totalMax);
    }

    public static void main(String[] args) throws Exception {
        pro();
    }
}