9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net


DP로 해결

  1. [A길이+1][B길이 +1] 배열을 생성한다.
  2. for문을 돌며 하나씩 비교해서 저장한다.
  3. 마지막값을 출력한다.

 

※ 비교방법)

만약 ABCD와 DEFC를 비교한다면

 A B  C D E F  C  - 비교할 때 같은 문자라면,  A B  와   D E F  비교값에 1을 더해준다.

 A B  C ,  D E  F  - 비교할 때 다른 문자라면,  A B   와  D 비교값과,  A B  D E  F  비교값 중 큰 값을 저장한다.

import sys
input = sys.stdin.readline
A = input().rstrip()
B = input().rstrip()

arr = [[0]*(len(B)+1) for _ in range(len(A)+1)]

for i in range(1, len(A)+1):
    for j in range(1, len(B)+1):
        if A[i-1] == B[j-1]:
            arr[i][j] = arr[i-1][j-1]+1
        else:
            arr[i][j] = max(arr[i-1][j], arr[i][j-1])

print(arr[len(A)][len(B)])
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기