BOJ 문제 링크: https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
두 수열이 주어졌을때, 모두의 부분 수열이 되는 수열 중 가장 긴 것(LCS)을 찾는 문제이다.
두 수열을 순회하면서 두 수열중 하나가 다음 문자로 넘어가거나, 두 수열을 가르키는 문자가 서로 같으면 LCS에 추가하고 둘다 다음 문자로 넘어가는 재귀 호출을 하면서 가장 큰 값을 리턴하는 경우를 찾는다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<cstring> | |
using namespace std; | |
string A, B; | |
int cache[1000][1000]; | |
int lcs(int a, int b) { | |
// a또는 b가 끝에 다다르면 LCS를 만들 수 없다. | |
if (a == A.length() || b == B.length()) return 0; | |
int& ret = cache[a][b]; | |
if (ret != -1) return ret; | |
ret = 0; | |
// A[a] == B[b]이면 해당문자를 LCS에 추가하거나 | |
if (A[a] == B[b]) | |
ret = max(ret, lcs(a + 1, b + 1) + 1); | |
// B에 다음문자로 LCS를 만들거나 | |
ret = max(ret, lcs(a, b + 1)); | |
// A에 다음문자로 LCS를 만든것 중에서 제일 큰걸 리턴 | |
ret = max(ret, lcs(a + 1, b)); | |
return ret; | |
} | |
int main() { | |
memset(cache, -1, sizeof(cache)); | |
cin >> A >> B; | |
cout << lcs(0, 0) << endl; | |
} |
코드 원본: https://github.com/sbl133/BOJ/blob/main/%239251.cpp
GitHub - sbl133/BOJ
Contribute to sbl133/BOJ development by creating an account on GitHub.
github.com

댓글을 통한 코드리뷰, 질문, 지적 언제든 환영입니다!
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 17828번 문자열 화폐 c++ (0) | 2021.09.29 |
---|---|
[BOJ] 백준 15686번 치킨 배달 c++ (0) | 2021.09.22 |
[BOJ] 백준 12865번 평범한 배낭 c++ (0) | 2021.09.20 |
[BOJ] 백준 14503번 로봇 청소기 (0) | 2021.09.04 |
[BOJ] 백준 2812번 크게 만들기 (0) | 2021.09.02 |