<문제 해석>
부분 수열을 보면 마지막 값인 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 |