본문 바로가기
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

댓글