[BaekJoon 11053 : 동적계획법, Python] - 가장 긴 증가하는 수열2

2021, Nov 01    


백준 11053 가장 긴 증가하는 수열2 : 실버 2



Solution


DP Memoization 활용(Bottom-up)


import sys
input = sys.stdin.readline

n = int(input())
nums = [-1]
nums += list(map(int, input().split()))

DP = [0 for _ in range(n+1)]     # i 번째 숫자까지 최장 수열의 길이

for i in range(1, n+1):
    for j in range(1, i):
        if nums[j] < nums[i]:
            DP[i] = max(DP[j]+1, DP[i])

print(max(DP) + 1)


풀이과정 및 느낀점


가장 기본적인 형태의 memoization 을 활용하는 DP문제이다.
주의해야 할 부분은 처음엔 DP[1] 만 1로 설정해주면 항상 첫 시작 숫자까지도 포함한 수열길이가 나올 거라고 생각하고 첫 번째 숫자가 증가수열에 포함이 안 된 경우를 고려하지 못했다.
처음에 ‘틀렸습니다’ 가 나오고 나서야 최종 출력에서 max(DP) + 1 을 해주었다.