https://www.acmicpc.net/problem/14002
Problem
- 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
- 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
조건
- 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
- 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
SOL
N이 N^2으로 충분히 해결이 가능하기 때문에, DP방식으로 오랜만에 구현을 해주었다.
DP 방식으로 구현해주면, Lis의 길이가 최대인 곳의 index부터 1개씩 줄여나가면서, LIS를 직접 구하는 방법도 가능하다.
import sys
input= sys.stdin.readline
N=int(input().rstrip())
seq=list(map(int,input().split()))
DP=[1]*N
for i in range(N):
for j in range(i):
if seq[j]<seq[i]:
DP[i]=max(DP[i],DP[j]+1)
Lis_len=max(DP)
print(max(DP))
Lis_seq=[]
idx=DP.index(Lis_len)
while idx>=0:
if DP[idx] ==Lis_len:
Lis_seq.append(seq[idx])
Lis_len-=1
idx-=1
for num in Lis_seq[::-1]:
print(num,end=" ")
'알고리즘 문제(SOL)' 카테고리의 다른 글
[백준/17088/파이썬] 등차수열 변환 (0) | 2022.02.19 |
---|---|
[백준/2422/파이썬] 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2022.02.18 |
[백준/12738/파이썬] 가장 긴 증가하는 부분수열 3 (0) | 2022.02.18 |
[백준/16637/파이썬] 괄호 추가하기 (2) | 2022.02.17 |
[백준/17244/파이썬] 아 맞다 ! 우산 (0) | 2022.02.17 |