728x90
반응형
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] )

www.acmicpc.net/problem/9251

 

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  

 

728x90
반응형

'백준 > 다이나믹 프로그래밍' 카테고리의 다른 글

# 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

+ Recent posts