[DP] 백준 - LCS 9251번

황준승·2021년 4월 28일
1
post-thumbnail
post-custom-banner

백준 - LCS 9251번

이 문제의 경우 주어진 단어의 길이는 1000글자이지만 주어진 시간은 pypy3의 경우 1.5초밖에 주어지지 않았다.

따라서 이중포문을 한 번 돌아서 문제의 답을 유추할 수 있어야했다. 동적계획법을 이용해보자라는 생각이 들었다.

문자열 간의 부분수열을 비교하기 위해서 2차원 테이블 형태로 데이터를 처리해야한다.

{ A, C, D, E, B }와 { B, C, D, E, A }를 이용해 테이블을 채우자.

위 테이블에서 파란색 셀의 0이 의미하는것은 {B} 와 {A}의 LCS의 길이이다.( = 0)

위 테이블에서 파란색 셀의 0이 의미하는것은 {B} 와 {A,C}의 LCS의 길이이다.( = 0 )

위 테이블에서 파란색이 의미하는 것은 {B}와 {A,C,D,E,B}의 LCS의 길이이다. ( = 1 )

위 테이블에서 파란색 셀이 의미하는것은 {B,C,D} 와 {A,C,D}의 LCS의 길이다. ( = 2 )

이런 테이블을 몇개 그리다 보면 규칙이 보인다.

초록색 셀끼리 비교할때 문자가 서로 다르다면 파란색 셀에는 왼쪽값과 윗쪽 값을 비교해서 그냥 큰 수를 쓰면 된다.

  • 위 테이블에서 의미하는 파란색 셀의 윗쪽 값은 {B,C} 와 { A,C,D,E }의 LCS 길이이다.( = 1 )

  • 위 테이블에서 의미하는 파라색 셀의 왼쪽 값은 {B,C,D}와 {A,C,D}의 LCS 길이이다.( = 2 )

  • 따라서 파란색 셀은 길이가 더 긴 왼쪽값을 선택함으로써 {B,C,D}와 {A,C,D,E}의 LCS 길이를 가지게 된다( = 2 )

    초록색 셀끼리 비교할때 문자가 서로 같다면 파란색 셀에는 왼쪽 위 대각선의 값에 +1을 해주면된다.

파란색 셀에 {B,C,D,E} 와 {A,C,D,E}의 LCS 길이인 3을 기록한다.

이런식으로 하면 LCS의 길이를 구할 수 있다.

출처

profile
다른 사람들이 이해하기 쉽게 기록하고 공유하자!!
post-custom-banner

0개의 댓글