본문 바로가기
Problem Solving/BOJ

[Python]14002. 가장 긴 증가하는 부분 수열 4 (LIS)

by 부르르 2019. 4. 5.

https://www.acmicpc.net/problem/14002

 

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

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

www.acmicpc.net


 

핵심아이디어는 변경시킨 인덱스를 별도의 배열에 저장하여 역추적 하는 것(v 에 저장 후 역추적).

 

n = int(input())
a = [0]+list(map(int, input().split()))
DP = [0]*(n+1)
v = [-1]*(n+1)

for i in range(1,n+1):
    for j in range(1, i, 1):
        # 자신(i)보다 값(a)은 작으면서 길이(DP)는 크다면
        if a[i] > a[i-j] and DP[i] < DP[i-j]:
            DP[i] = DP[i-j]
            v[i] = i-j # 역 추적 하기 위한 인덱스를 배열에 저장
    DP[i] += 1

print(max(DP))

### 역추적 하기 위해 추가된 부분 ###
ans = []
max_idx = DP.index(max(DP))
while max_idx != -1:
    ans.append(a[max_idx])
    max_idx = v[max_idx]
ans.reverse()

print(' '.join(map(str, ans)))
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]17135. 캐슬 디펜스  (0) 2019.04.07
[Python]13398. 연속합 2  (0) 2019.04.07
[Python]11053. 가장 긴 증가하는 부분 수열 (LIS)  (0) 2019.04.05
[Python]2156. 포도주 시식  (0) 2019.04.04
[Python]9465. 스티커  (0) 2019.04.04

댓글