알고리즘 문제/다이나믹 프로그래밍

다이나믹 프로그래밍 (최장 공통 부분 수열 LCS)

안도일 2022. 2. 7. 17:41

ACAYKP

CAPCAK

앞의 문자열의 sub sequence를 X, 뒤의 문자열의 sub sequence를 Y라고 했을 때 문자를 하나씩 늘려가면서 비교해보자

X: A

Y: C

두 문자열로 만들 수 있는 LCS의 길이는 0이다.

 

X: A

Y: CA

두 문자열로 만들 수 있는 LCS의 길이는 1이다.

 

X: A

Y: CAP

두 문자열로 만들 수 있는 LCS의 길이는 1이다.

 

X: A

Y: CAPC

두 문자열로 만들 수 있는 LCS의 길이는 1이다.

위와 같이 Y가 끝까지 CAPCAK까지 구하게 된다면 X를 하나씩 늘려주면 된다.

 

X: AC

Y: C

두 문자열로 만들 수 있는 LCS의 길이는 1이다.

 

X: AC

Y: CA

두 문자열로 만들 수 있는 LCS의 길이는 1이다.

 

표를 만들고 채우기 위해 값이 증가하는 방식을 살펴보면 다음과 같이 정의할 수 있다.

 

X와 Y에 가장 최근에 추가된 글자가 서로 같을 때

dp[i][j] = dp[i - 1][j - 1] + 1                          // 길이는 (두 글자가 추가되기 전 가장 큰 길이 + 1)이 됨

추가된 글자가 서로 다를 때

dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])          // 기존에 주어진 문자열로 만들 수 있던 최대 길이를 갖게 됨


출처: https://suri78.tistory.com/11 [공부노트]

LCS는 변형해서 많이 나오는 문제이기 때문에 근본을 완벽히 이해해 놓으면 잘 활용해 문제를 풀 가능성이 높다.