문제

[백준] 가장 긴 증가하는 부분 수열 4 (Gold 4)

요약

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하여라. 단, A의 크기는 1보다 크고 1,000보다 작으며, A(i)도 1보다 크고 1,000보다 작다.

분류

  • 다이나믹 프로그래밍

풀이

1. 내 풀이 (DP)

A의 크기가 작고, A(i)는 음수가 아니기 때문에 O(N^2) 알고리즘으로 쉽게 구할 수 있다. 이후 dp를 역으로 순회하며 각 인덱스에 해당하는 숫자들을 뽑는다.

n = int(input())
arr = list(map(int, input().split()))

dp = [1] * n
ans = [0] * n

for i in range(n):
    for j in range(i):
        if arr[j] < arr[i]:
            dp[i] = max(dp[i], dp[j] + 1)

m = max(dp)
print(m)
ans = []
for i in range(n - 1, -1, -1):
    if m == 0:
        break
    if dp[i] == m:
        ans.append(arr[i])
        m -= 1
print(*ans[::-1])