<문제 해석>

부분 수열을 보면 마지막 값인 50부터 생각을 해보자.

지목한 값이 50일 경우 앞에 올 수 있는 가장 가까운 값은 30이다. 30일 경우 가장 가까운 값은 20이고, 20일 경우에 앞에 올 수 있는 값을 10이다.

즉, 50을 마지막 DP값이라고 생각했을 때, 30의 DP값을 이미 계산 되어 있다고 생각하면 쉽게 이해가 된다.

이중 for문을 구성하여 지목한 값과 그 전의 값들을 비교하여 값이 작으면 DP값을 비교하면서 전의 DP값이 큰것을 마지막 DP값으로 계속 넣어주면 되겠다.

수열의 최소 길이가 1이므로 DP배열의 값들을 1로 초기화한 후 아래와 같이 점화식을 구성하였다.

for(int i=0;i<6;i++){

 for(int j=0;j<i;j++){

  if(A[i]>A[j]){

   dp[i] = Math.max(dp[j]+1, dp[i])

  }

 }

}

이 점화식을 토대로 소스 코드를 구성해 보았다.

<소스코드>

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		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 값 1로 지정
			dp[i] = 1;
		}
		
		for(int i = 1; i < n; ++i){
			for (int j = 0; j < i; ++j){
				if (arr[i] > arr[j]){
					//앞의 숫자와 비교하여 작을 경우 전에 계산한 길이의 최대값을 dp에 넣어준다.
					//ex) 10, 14, 11, 12 의 케이스를 계산
					dp[i] = Math.max(dp[j] + 1, dp[i]);
				}
			}
		}

		Arrays.sort(dp);
		System.out.println(dp[n-1]);
	}

}


'algorism' 카테고리의 다른 글

9095 1,2,3 더하기  (0) 2019.02.11
11727 2xn 타일링 2  (0) 2019.02.11
11726 2xn 타일링  (0) 2019.02.11
1463 1로 만들기  (0) 2019.02.11
10844 쉬운 계단 수 java  (0) 2019.02.10

+ Recent posts