카테고리 없음

[python 백준] 11053 : 가장 긴 증가하는 부분 수열 (실버 2)

Alpaca_data_cloud 2024. 8. 30. 16:06

 

import sys
input = sys.stdin.readline

def lis_length(arr):
    n = len(arr)
    dp = [1] * n

    for i in range(1, n):
        for j in range(i):
            if arr[i] > arr[j]:
                dp[i] = max(dp[i], dp[j] + 1)

    return max(dp)

# 입력 처리
n = int(input())
number = list(map(int, input().split()))

# 최장 증가 부분수열의 길이를 계산
maxcount = lis_length(number)

print(maxcount)

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

문제

수열 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)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

예제 입력 1 복사

6
10 20 10 30 20 50

예제 출력 1 복사

4

 

 

해당 코드를 처음 풀었을 때에는 부분수열을 사용해서 풀이해야 하기 때문에 비트 마스크를 사용했다.

import sys
input = sys.stdin.readline


def numbercount(subsequence):
    count = 0
    maxnum = 0
    for i in range(len(subsequence)):
        if maxnum < subsequence[i]:
            maxnum = subsequence[i]
            count += 1
    return count

n = int(input())
number = list(map(int,input().split()))

bit = 2 ** n
maxcount = 0
for i in range(bit):
    subsequence = []
    for j in range(n):
        if ( i & (1<<j)) != 0:
            subsequence.append(number[j])    
    count = numbercount(subsequence)
    if maxcount < count:
        maxcount = count

print(maxcount)

하지만 이렇게 하면 시간초과가 발생한다,

 

해결방안은 DP를 활용하여 푸는 것이다.