LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력 | 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. |
출력 | 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다. |
풀이전략 | 1. 이차원 배열에 DP 값을 저장합니다. 2. DP[i][j]는 첫 번째 수열의 i 번째까지와 두 번째 수열의 j 번째까지 공통된 부분 수열의 최대 길이 입니다. 3. 만일 A[i]와 B[j]가 같다면 DP[i-1][j-1]에서 하나를 추가한 경우 입니다. 4. 만일 A[i]와 B[j]가 다르다면 max(DP[i][j-1], DP[i-1][j])입니다. |
주의사항 | 입력으로 들어오는 두 개 수열의 길이가 다를 수 있습니다. 따라서 DP를 위한 이차원 배열도 두 개의 길이를 바탕으로 구성해야 합니다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
a = input().strip()
b = input().strip()
dp = [[0 for j in range(len(b)+1)] for i in range(len(a)+1)]
for i in range(len(a)):
for j in range(len(b)):
if a[i]==b[j]:
dp[i+1][j+1]=dp[i][j] + 1
else:
dp[i+1][j+1]= max(dp[i+1][j], dp[i][j+1])
print(dp[-1][-1])
|
cs |
'프로그래밍' 카테고리의 다른 글
OCL(The Object Constraint Language) 예제를 기반으로한 설명 (0) | 2020.07.07 |
---|---|
[백준 11054 가장 긴 바이토닉 부분수열] 파이썬 풀이 (0) | 2020.07.05 |
[백준 실버 1912 동적프로그래밍] 연속합문제 파이썬 (0) | 2020.06.30 |
Python Class에 대한 이해 (0) | 2020.06.21 |
파이썬 Print 하는 방법 (0) | 2020.06.20 |