Algorithm, boj, 가장 큰 증가 부분 수열(11055)

풀이

  • 입력 배열의 길이와 같은 dp배열을 생성한다
  • dp[i]에는 arr[i]값이 가장 큰 값으로 하는 부분배열의 길이가 입력된다
  • 가장 작은 부분배열의 크기는 1이 되므로 dp배열의 초기값을 1로 해준다
  • i는 두번째 수부터 마지막 수가 되고, 각각의 수의 이전수가 해당수보다 작은지 확인하고, 작다면 수열의 길이를 확인하여 입력한다.
package org.baekjoon;

import java.util.Scanner;

public class test11055_dp_LongestSubsequence {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[] arr = new int[num];
		int[] dp = new int[num];
		for (int i = 0; i < num; i++) {
			arr[i] = sc.nextInt();
			dp[i] = 1;
		}

		int max = 1;
		for (int i = 1; i < num; i++) {
			for (int j = 0; j < i; j++) {
				if ( arr[i] > arr[j] ) {
					dp[i] = Math.max(dp[i], dp[j]+1);
					max = Math.max(max, dp[i]);
				}
			}
		}
		System.out.println(max);
	}
}


가장 큰 증가 부분 수열 (11055)

package org.baekjoon;

import java.util.Scanner;

public class test11055_dp_BiggesSubsequence {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[] arr = new int[num];
		int[] dp = new int[num];
		for (int i = 0; i < num; i++) {
			arr[i] = sc.nextInt();
			dp[i] = arr[i];
		}

		int max = 0;
		for (int i = 1; i < num; i++) {
			for (int j = 0; j < i; j++) {
				if ( arr[i] > arr[j] ) {
					dp[i] = Math.max(dp[i], dp[j]+arr[i]);
				}
				max = Math.max(max, dp[i]);
			}
		}
		System.out.println(max);
	}
}


Reference