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는 변형해서 많이 나오는 문제이기 때문에 근본을 완벽히 이해해 놓으면 잘 활용해 문제를 풀 가능성이 높다.
'알고리즘 문제 > 다이나믹 프로그래밍' 카테고리의 다른 글
[Java] 배낭 문제 (안녕) (0) | 2023.01.12 |
---|---|
다이나믹 프로그래밍 (LCS 2) (0) | 2022.02.07 |
배낭 (평범한 배낭 문제) (0) | 2022.01.22 |
다이나믹 프로그래밍 (가장 긴 증가하는 부분 수열 LIS) (0) | 2022.01.19 |
다이나믹 프로그래밍 (탑다운 형식) (0) | 2022.01.19 |