선릉역 1번 출구

최장 증가 부분 수열 (longest increasing subsequence) 본문

Algorithm/Algorithm study

최장 증가 부분 수열 (longest increasing subsequence)

choideu 2021. 9. 15. 23:05

최장 증가 부분 수열이란?

원소가 n개인 배열의 일부 원소를 골라내 만든 부분 수열 중에서(상대적인 순서는 유지) 길이가 최대인 수열을 의미한다.

ex) {4, 2, 3, 1, 6, 5}이라면? {2, 3, 6}이 된다.


가장 기본적인 해결 방안은 dynamic programming을 사용하는 것이다.

dp[i] : i까지 인덱스 중 가장 긴 수열의 길이

dp = [1] * n

for i in range(n):
    for j in range(i):
        if ls[j] < ls[i]:
            dp[i] = max(dp[i], dp[j] + 1)
            
print(max(dp))

# ls는 수열이 저장된 list임

# dp[i]는 i까지 인덱스 중 가장 긴 수열의 길이이기 때문에 j는 i보다 작아야 하고(배열의 순서) ls[j] 또한 ls[i]보다 작을 때 dp[i] = max(dp[i], dp[j] + 1)이 된다. max(dp[i], dp[j] + 1)을 하는 이유는 예를 들어 4번째 index일 때, 0~3까지 비교를 해야 하기 때문에 값이 중간에 1에서 다른 값으로 갱신이 될 수 있기 때문이다.

 

10 20 10 30 20 50를 보자

0 1 2 3 4 5
1 2 1 3 2 4

0 번째는 자기보다 작은 index가 없어서 1이 된다.

1 번째는 10보다 커서 2가 된다.

2 번째는 자기보다 작은 값이 없어서 1이 된다.

3 번째는 0 번째와 비교 후, dp[0] + 1한 값인 2가 되고, 그다음 1 번째인 2와 비교해 max(2, 3)을 해서 3이 된다.

4 번째는 0 번째와 비교 후, 2가 되고 그다음 2번째인 10과 비교해 (2, 2)가 돼서 2가 된다.

5 번째는 0 번째 -> 2, 1 번째 -> 3, 2 번째 -> 3, 3 번째 -> 4, 4번째 -> 4가 된다.

 

'Algorithm > Algorithm study' 카테고리의 다른 글

dynamic programming  (0) 2021.09.12
queue  (0) 2021.08.30
재귀(Recursion)  (0) 2021.08.19
Comments