For Programmer
백준 9252번 파이썬 문제풀이(LCS 2) - dp(역추적) 본문
728x90
a = '#' + input()
b = '-' + input()
dp = [[0 for _ in range(len(b))] for _ in range(len(a))]
'''
단순히 생각해서 2개의 문자열에 뒤에 같은 문자가 들어오면 공통 부분 문자열의 개수가 1개씩 증가한다는 개념을 이용해서
DP를 구하면 쉽다
'''
# 역추적을 위한 pre배열
pre = [[[-1, -1] for _ in range(len(b))] for _ in range(len(a))]
for i in range(1, len(a)):
for j in range(1, len(b)):
if a[i] == b[j]:
dp[i][j] = dp[i - 1][j - 1] + 1
pre[i][j] = [i - 1, j - 1]
else:
if dp[i - 1][j] > dp[i][j - 1]:
dp[i][j] = dp[i - 1][j]
pre[i][j] = [i - 1, j]
else:
dp[i][j] = dp[i][j - 1]
pre[i][j] = [i, j - 1]
print(dp[len(a) - 1][len(b) - 1])
x = len(a) - 1
y = len(b) - 1
ans = ''
while x != 0 and y != 0:
if pre[x][y][0] == x - 1 and pre[x][y][1] == y - 1:
ans += a[x]
x, y = pre[x][y][0], pre[x][y][1]
if ans != '':
print(ans[::-1])
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1194번 파이썬 문제풀이(달이 차오른다 가자 ) - (dfs + 비트마스킹) (0) | 2022.04.15 |
---|---|
백준 1311번 파이썬 문제풀이(할 일 정하기 ) - (dp + 비트마스킹) (0) | 2022.04.14 |
백준 2096번 파이썬 문제풀이(내려가기) - dp (0) | 2022.04.12 |
백준 9251번 파이썬 문제풀이(LCS) - dp (0) | 2022.04.12 |
백준 12015번 파이썬 문제풀이(가장 긴 증가하는 부분 수열 2 ) - 이분탐색 + dp (0) | 2022.04.12 |
Comments