[백준 9252] LCS 2
🥚문제링크
https://www.acmicpc.net/problem/9252
- 다이나믹 프로그래밍
🍳코드
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline
str1 = " " + input().strip()
str2 = " " + input().strip()
dp = [[0]*len(str2) for _ in range(len(str1))]
for i in range(1, len(str1)):
for j in range(1, len(str2)):
if str1[i] == str2[j]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
def dfs(r, c, LCS_str):
# return
if dp[r][c] == 0:
return LCS_str
move_r = [0, -1, -1]
move_c = [-1, 0, - 1]
for i in range(3):
new_r = r + move_r[i]
new_c = c + move_c[i]
if 0 <= new_r < len(str1) and 0 <= new_c < len(str2):
# 왼쪽, 위쪽으로 이동하는 경우는 dp[r][c]와 dp[new_r][new_c]가 같을 때
if i == 0 or i == 1:
if dp[new_r][new_c] == dp[r][c]:
return dfs(new_r, new_c, LCS_str)
# 왼쪽 대각선 위로 이동하는 경우는 dp[new_r][new_c]가 dp[r][c]-1일 때
else:
if dp[new_r][new_c] == dp[r][c] - 1:
return dfs(new_r, new_c, str1[r] + LCS_str)
# LCS의 길이
LCS_len = dp[len(str1) - 1][len(str2) - 1]
print(LCS_len)
if LCS_len > 0:
# backward path로 LCS 찾기
i = len(str1) - 1
j = len(str2) - 1
LCS_str = dfs(i, j, "")
print(LCS_str)
🧂아이디어
DP, LCS
- LCS 알고리즘
Author And Source
이 문제에 관하여([백준 9252] LCS 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eastgloss0330/백준-9252-LCS-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)