in.add()

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

Algorithm/BOJ

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

idan 2021. 9. 16. 21: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

 

문제 해결 방법

DP를 이용한 LIS알고리즘으로 구현했다.

 

import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int[] arr = new int[N + 1];
        int[] length = new int[N + 1];
        int max = 0;

        for (int i = 1; i <= N; i++) {
            arr[i] = sc.nextInt();
        }

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

        Deque<Integer> q = new LinkedList<>();
        int idx = max;

        for(int i = N; i > 0; i--) {
            if (idx == length[i]) {
                q.push(arr[i]);
                idx--;
            }
        }

        System.out.println(max);
        while (!q.isEmpty()) {
            System.out.print(q.pop() + " ");
        }
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

[17472] 다리 만들기 2  (0) 2021.09.18
[14003] 가장 긴 증가하는 부분 수열 5  (0) 2021.09.16
[1149] RGB거리  (0) 2021.09.14
[2116] 주사위 쌓기  (0) 2021.09.11
[2012] 등수 매기기  (0) 2021.09.10
Comments