Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 11053] 가장 긴 증가하는 부분 수열 (Python3) 본문

Problem Solving

[BOJ 11053] 가장 긴 증가하는 부분 수열 (Python3)

흑개 2021. 3. 7. 23:41

www.acmicpc.net/problem/11053

 

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

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
N=int(input())
A=list(map(int, input().split()))
dp=[0]*N
dp[0]=1
 
for i in range(1,N):
    max_value=0
    for j in range(0,i):
        if A[i]>A[j]:
            max_value=max(dp[j], max_value)
    dp[i]=max_value+1
 
print(max(dp))
cs

 

풀이방법에 대해 긴가민가 했었는데 AC 받아서 다행이라고 느낀..문제

시간복잡도는 O(n^2) 이다.

가장 긴 증가하는 배열을 구하는 문제이다.

각 배열보다 크기가 작은 애들 중, 배열의 길이가 가장 큰 걸 뽑아서+1 해주면 구해진다.

dp(n)=(A[0]~A[n-1]<A[n] 이고 그 중 dp배열의 값이 가장 큰 애들)+1 이다.

 

검색해보니 더 DP 답게 푼 풀이가 다수였다.

A[n]보다 크기가 작은 배열을 만나고, dp[n]<=dp[i] 일 때마다 dp[n]에 1씩 더해준다(dp[n]은 1이라고 초기화)!