본문 바로가기

알고리즘/백준 문제 풀이

[Python] 11053번 가장 긴 증가하는 부분 수열

728x90

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

 

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

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

www.acmicpc.net


 

22/09/21

 

 

전형적인 유명한 DP문제. 그리고 그렇게 어렵지도 않은 DP문제이다.


 

문제 접근 방식:

 

 

DP[i] = A[i]를 마지막 값으로 가지는 가장 긴 부분 수열의 길이라고 정의하자.

 

그러면 O(n^2)의 시간 복잡도로 우리는 이 문제를 해결할 수 있다.

 

DP[i] = A[i] > A[j] (i > j)가 성립되는 인덱스 j에 대해, DP[0]~DP[i-1]까지의 값들 중에서 DP[j]들의 최댓값 + 1로 정의가 될 수 있기 때문이다.

 

이를 토대로 구현하면 된다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 11053번 가장 긴 증가하는 부분 수열
# DP
'''
접근 방법:
DP[i] = A[i]를 마지막 값으로 가지는 가장 긴 부분 수열의 길이
'''
import sys
input = sys.stdin.readline

N = int(input())
A = list(map(int, input().rstrip().split()))
DP = [1 for _ in range(N)]
for i in range(1, N):
    DP[i] = max([0]+[DP[j] for j in range(i) if A[i] - A[j] > 0]) + 1
print(max(DP))

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[Python] 3108번 로고  (0) 2022.10.20
[Python] 10844번 쉬운 계단 수  (0) 2022.10.20
[Python] 1629번 곱셈  (0) 2022.10.13
[Python] 25576번 찾았다 악질  (0) 2022.10.13
[Python] 10216번 Count Circle Groups  (0) 2022.10.13