Computer Science/알고리즘

백준 Java | 백준 11722번 가장 긴 감소하는 부분 수열 Java 문제 풀이

토마토. 2023. 4. 18. 14:39

11722번: 가장 긴 감소하는 부분 수열 (acmicpc.net)

 

11722번: 가장 긴 감소하는 부분 수열

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

www.acmicpc.net

 

DP[i] = A[i]를 마지막 값으로 가지는 가장 긴 감소 부분 수열의 길이로 정의하면 쉽게 풀 수 있다. 

O(N^2) 알고리즘

import java.util.*;

class Main {
    static int n;
    static int[] A;
    static int[] DP;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();

        A = new int[n];
        DP = new int[n];
        for (int i=0;i<n;i++){
            A[i] = sc.nextInt();
        }

        int answer = solution();
        System.out.println(answer);
    }

    private static int solution() {
        int max = 1;
        for (int i=0;i<n;i++){
            int tmp = 1;
            for (int j=0;j<i;j++){
                if (A[j] > A[i]){
                    tmp = Math.max(DP[j]+1, tmp);
                }
            }
            DP[i] = tmp;
            max = Math.max(DP[i], max);
        }
        return max;
    }
}