a = input()
b = input()
la = len(a)
lb = len(b)
dp = [ [0]*(lb+1) for _ in range(la+1) ]
for i in range(1,la+1):
for j in range(1,lb+1):
if a[i-1] == b[j-1] :
dp[i][j] = 1+ dp[i-1][j-1]
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
# print(dp[i])
print( dp[la][lb] )
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
# DP 에서 자주 나오는 내용이므로 잘 이해해보자.
DP 시간 복잡도 : O(mn)
완전 탐색 복잡도 : O(2^n)
입력 문자열 1 : n
입력 문자열 2 : m
step1 ) (n+1)*(m+1) 크기의 dp 배열을 만든다.
step2 ) 규칙 적용하기
> 규칙 1 : n[i] == m[i] -> dp[i][j] = 1 + dp[i-1][j-1]
만약 양쪽 문자열 끝의 값이 같다면, 그 두 문자열을 제외한 앞 부분의 최대 길이에 1 을 더한다.
> 규칙 2 : n[i] != m[i] -> dp[i][j] = max( dp[i-1][j] , dp[i][j-1] )
만약 양쪽 문자열 끝의 값이 다르면, 각 문자열이 오기 전 단계의 최대 값을 유지한다.
step3 ) 이해하기
n = ABCDE
m = BXDE
0 B X D E
0 0 0 0 0 0
A 0 0 0 0 0 <- A와 BXDF 는 일치하는 값이 없다.
B 0 1 1 1 1 <- AB와 B / BX / BXD / BXDE 를 비교한다고 생각하면 된다.
C 0 1 1 1 1
D 0 1 1 2 2
E 0 1 1 2 3
'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글
# 13301 타일 장식물 (0) | 2020.09.17 |
---|---|
# 9252 LCS2 (0) | 2020.09.17 |
# 11048 이동하기 (0) | 2020.09.15 |
# 9625 BABBA (0) | 2020.09.15 |
# 11660 구간 합 구하기 5 ( 다시 하기. . 시간 초과 해결 x ) (0) | 2020.09.14 |