본문 바로가기

알고리즘 삽질장

[BOJ] 11722번 - 가장 긴 감소하는 부분 수열

반응형


문제설명

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

 

11722번: 가장 긴 감소하는 부분 수열

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

www.acmicpc.net

사고과정

  • 가장 긴 증가하는 부분 수열을 찾는 LIS 알고리즘을 이용하되 주어진 배열을 reverse 해서 LIS를 적용하거나 LIS 알고리즘 내부의 부등호를 반대로 바꾸어주면 된다.
  • 예전에도 관련 문제를 풀어봐서 수월히 해결했다.

풀이

n = int(input())
array = list(map(int, input().split()))
array.reverse()
dp = [1] * n

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

print(max(dp))
반응형