📍 문제 설명
💡 접근
최대 부분 증가 수열을 출력하는 문제
출력할 때 dp 테이블을 참조하여 최대 길이부터 1씩 작아지면서 스택에 넣고 출력하면 된다.
👩💻 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n, m, answer;
static int[][] board;
static int[] arr, dp;
static boolean[][] visited;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static ArrayList<String> list = new ArrayList<>();
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = kb.nextInt();
arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
//dp[n]은 n번째 인덱스를 마지막 항으로 하는 최대 증가 부분 수열
dp = new int[n];
dp[0] = 1;
for(int i = 1; i < n; i++) {
int max = 0;
//현재 항의 이전 항들을 탐색
for(int j = i-1; j >= 0; j--) {
//1. 이전 항이 현재 항 보다 더 작아야함
//2. 이전 항의 길이가 max 값보다 커야함
if(arr[j] < arr[i] && dp[j] > max) max = dp[j];
//
dp[i] = max + 1;
answer = Math.max(answer, dp[i]);
}
}
System.out.println(answer == 0 ? 1 : answer);
Stack<Integer> stack = new Stack<>();
for(int i = n-1; i >= 0; i--) {
if(dp[i] == answer) {
stack.push(arr[i]);
answer--;
}
}
while(!stack.isEmpty()) sb.append(stack.pop() + " ");
System.out.println(sb.length() == 0 ? arr[0] : sb);
}
private void solution() {
}
}