동적 계획법 예제 - 7

문제 분석

  • LCS(longest common subsequence)는 문자열을 이용한 대표적인 동적 계획법 문제이다.

  • 이러한 종류의 문제를 풀기 위해서는 각 문자열을 축으로 하는 2차원 리스트를 생성해야 한다.

img_13.png
  • 이 2차원 리스트 자체가 dp 테이블이 된다.

손으로 풀어보기

  1. LCS 점화식을 이용해 값을 채운다. 특정 자리가 가리키는 행과 열의 문자열값을 비교해 값이 같으면 테이블의 대각선 왼쪽 위의 값에 1을 더한 값을 저장한다.

    • dp[i][j] = dp[i - 1][j - 1] + 1

    • 비교한 값이 다르면 테이블의 왼쪽과 위쪽 값 중 큰 값을 선택해 저장한다.

    • dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

위에서 세운 점화식으로 테이블을 채우면 다음과 같이 나타낼 수 있다.

img_14.png
  1. LCS 정답을 출력한다.

    • 먼저 마지막부터 탐색을 수행한다.(재귀 형태)

    • 해당 자리에 있는 인덱스 문자열 값을 비교해 값이 같으면 LCS에 해당하는 문자로 기록하고, 왼쪽 대각선 위로 이동한다.

    • 비교한 값이 다르면 테이블의 왼쪽과 위쪽 값 중 큰 값으로 이동한다.

img_15.png

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated