https://www.acmicpc.net/problem/9251
9251번: LCS
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
www.acmicpc.net
문제 개요
LCS(최장 공통 부분 수열) 문제는
최장 공통 부분 수열 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 최장 공통 부분수열 문제는 LCS라고도 불린다. 이는 주어진 여러 개의 수열 모두의 부분수열이 되는 수열들 중에 가장 긴 것을 찾는 문제다.(종종 단 두 개중 하
ko.wikipedia.org
위를 참고해서 c++ 알고리즘으로 바꾸었다.
$$ LCS(X_{i},Y_{j})=\left\{\begin{matrix}
\: LCS(X_{i-1}, Y_{j-1}) +1 \:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:if\: x_{i} = y_{j}\\
longest(LCS(X_{i}, Y_{j-1}), LCS(X_{i-1}, Y_{j})) \:\:\:if\: x_{i} \neq y_{j}
\end{matrix}\right. $$
점화식에 따라서 코드를 짜면 된다.
코드
#include <bits/stdc++.h>
using namespace std;
string a, b;
int LCS[1001][1001];
void lcs_a() {
for (int i = 1; i <= a.size(); i++) {
for (int j = 1; j <= b.size(); j++) {
if (a[i-1] == b[j-1]) {
LCS[i][j] = LCS[i-1][j-1] + 1;
} else {
LCS[i][j] = max(LCS[i-1][j], LCS[i][j-1]);
}
}
}
}
int main(void) {
cin >> a >> b;
lcs_a();
cout << LCS[a.size()][b.size()];
}
'알고리즘 > 동적 계획법' 카테고리의 다른 글
(c++) 동적계획법 BOJ 1520번: 내리막 길 (0) | 2024.01.22 |
---|---|
(c++) 동적계획법 BOJ 11049번: 행렬 곱셈 순서 (0) | 2024.01.21 |
(c++) BOJ 12865번: 평범한 배낭 (1) | 2024.01.19 |
(c++) LIS BOJ 2565번: 전깃줄 (0) | 2024.01.18 |
(c++) 11054번: 가장 긴 바이토닉 부분 수열 (0) | 2024.01.16 |
댓글