취미처럼

[백준] 14002번 가장 긴 증가하는 부분 수열 4 본문

Algorithm/백준

[백준] 14002번 가장 긴 증가하는 부분 수열 4

sirius 2021. 3. 5. 09:36
https://www.acmicpc.net/problem/14002
 

14002번: 가장 긴 증가하는 부분 수열 4

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

www.acmicpc.net

arr 10 20 10 30 20 50
dp 1 2 1 3 1 4

max = 4

max값을 역순으로 뽑아서 해당 arr 값을 출력

 

import java.util.*;
import java.io.*;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N + 1];
        int[] dp = new int[N + 1];
        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i = 0 ; i < N ; i++) {
        	arr[i] = Integer.parseInt(st.nextToken());
        }

        int ans = 1;
        dp[0] = 1;
        for(int i = 1; i <= N; i++) {
            dp[i] = 1;
            for(int j = 0; j < i; j++) {
                if(arr[i] > arr[j] && dp[i] <= dp[j]) {
                	dp[i] = dp[j] + 1;
                }
            }
            ans = Math.max(ans, dp[i]);
        }

        int num = ans;
        Stack<Integer> stack = new Stack<>();
        for(int i = N-1; i >= 0; i--) {
            if(num == dp[i]) {
                stack.push(arr[i]);
                num--;
            }
        }

        while(!stack.isEmpty()) {
        	sb.append(stack.pop() + " ");
        }

        System.out.println(ans);
        System.out.println(sb);
    }
}

'Algorithm > 백준' 카테고리의 다른 글

[백준] 1699번 제곱수의 합  (0) 2021.03.08
[백준] 1912번 연속합  (0) 2021.03.08
[백준] 11053번 가장 긴 증가하는 부분 수열  (0) 2021.03.05
[백준] 2193번 이친수  (0) 2021.03.05
[백준] 10844번 쉬운 계단 수  (0) 2021.03.05
Comments