

n = int(input()) A = list(map(int,input().split())) # A에 저장된 각 값들까지의 가장 긴 증가하는 부분 수열의 길이를 저장하는 배열 # A에 저장된 0번째 수까지의 가장 긴 증가부분수열의 길이는 1이므로 # 1로 초기화함 dp=[1]*n # A에 저장된 1번째값부터 자신의 앞에 있는 수들과 비교를 함 for i in range(1,n): for j in range(i): # 자신이 더 크다면 기존의 증가부분수열의 길이와 # 부분수열에 자기자신을 추가했을 때의 길이 중 더 긴 것으로 업데이트함 if A[i]>A[j]: dp[i] = max(dp[j]+1, dp[i]) # 가장 긴 증가부분수열의 길이를 저장함 order = max(dp) # 증가부분수열의 실제 값을 저장할 리스트 subsequence = [] # dp테이블을 뒤에서부터 탐색함 for i in range(n-1,-1,-1): # dp[i]==order라는 건 A[i]가 부분수열의 값이라는 뜻 if dp[i]==order: subsequence.append(A[i]) order -= 1 # subsequence에는 증가부분수열이 역순으로 저장되어있으니 다시 뒤집어줌 subsequence.reverse() # 가장 긴 증가부분수열의 길이 print(max(dp)) # 가장 긴 증가부분수열의 값 print(*subsequence)
'Algorithm > [BOJ] - Python' 카테고리의 다른 글
[백준] 1912 : 연속합 python (0) | 2023.10.01 |
---|---|
[백준] 2156 : 포도주 시식 python (0) | 2023.10.01 |
[백준] 1932 : 정수 삼각형 python (0) | 2023.09.29 |
[백준] 12865 : 평범한 배낭 python (0) | 2023.09.28 |
[백준] 1149 : RGB거리 python (1) | 2023.09.28 |