PS/BOJ

11055

easy16 2022. 4. 24. 23:43

가장 큰 증가부분 수열

 

 

dp[i]=dp[i-1]

if arr[j]<arr[i]

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

 

이 문제에는 DP(K-max)는 사용 불가. (엑셀 참조)

11055_가장큰증가부분수열.xlsx
0.01MB

 

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

class Main {

	static int N;
	static int answer;

	public static void main(String args[]) {
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] arr = new int[1001];
		int[] dp = new int[1001];

		for (int i = 0; i < N; ++i)
			arr[i] = in.nextInt();

		dp[0] = arr[0];
		//초기화 잊지마라 루프에서 안챙겨준다.
		answer = dp[0];
		for (int i = 1; i < N; ++i) {
			dp[i]=arr[i];//최소값은 자기 자신
			for (int j = i - 1; j >= 0; --j) {
				if (arr[j] < arr[i]) {
					dp[i] = Math.max(dp[i], dp[j] + arr[i]);
				}
				answer = Math.max(dp[i], answer);					
			}			
		}
		
		/*
		for (int i = 0; i < N; i++) {
			System.out.printf("[%d %d] ", i, dp[i]);
		}
		System.out.println();*/
		
	
		System.out.println(answer);
	}
}

ex)
10
1000 100 2 50 60 3 5 6 7 8
[0 1000] [1 100] [2 2] [3 52] [4 112] [5 5] [6 10] [7 16] [8 23] [9 31] 
1000