백준

백준 11722 가장 긴 감소하는 부분 수열(Java)

Park DJ 2023. 2. 9. 03:21

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

 

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

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

www.acmicpc.net


 

해석 및 팁

 


 

이 문제는 백준 11053 가장 긴 증가하는 부분 수열 문제와 유사한 문제이며 다이내믹프로그래밍을 이용하면 됩니다. dp[] 배열 에는 각 원소에서 가장 긴 감소 수열의 길이를 넣고 현재 값이 이전 값보다 작으면 +1 해주면 됩니다.

 


 

Java 코드

 


import java.util.Scanner;

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

    int max = -1;
    int n = sc.nextInt();
    int arr[] = new int[n];
    int dp[] = new int[n];
    
    for(int i = 0; i < n; i++) {
      arr[i] = sc.nextInt();
      dp[i] = 1;
    }

    for(int i = 0; i < n; i++) {
      for(int j = 0; j < i; j++) {
        if(arr[j] > arr[i] && dp[j] >= dp[i]) dp[i] = dp[j] + 1;
      }
    }

    for(int i = 0; i < n; i++) max = Math.max(max, dp[i]);

    System.out.println(max);
  }
}