풀이
LCS - 최장 공통부분 수열
점화식
if(A[i-1] == B[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
비교하는 두 문자가 같다면 dp [i-1][j-1] + 1
비교하는 두 문자가 다르다면 dp[i-1][j], dp [i][j-1]
둘 중 큰 값을 구한다.
그림 설명
전체 코드
#include <bits/stdc++.h>
using namespace std;
void init(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
string A, B;
int dp[1003][1003];
int main(){
init();
cin >> A >> B;
for(int i = 1; i <= A.length(); ++i){
for(int j = 1; j <= B.length(); ++j){
if(A[i-1] == B[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
cout << dp[A.length()][B.length()];
return 0;
}
문제를 풀며
처음 문제를 보고서는 도저히 감을 잡을 수 없어 힌트를 보고 푼 문제이고,
DP를 풀때마다 이렇게도 활용할 수 있구나 하고 놀라는 일이 잦은 것 같다.
밑에 참고에 붙인 링크를 통해 힌트를 얻었으며, LCS에 대해 정말 자세하게 기술되어 있으니 꼭 보도록 하자
[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence
LCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.
velog.io
'💻 Computer > 🐘 Algorithm' 카테고리의 다른 글
[1915] 가장 큰 정사각형 - C++ (0) | 2023.06.23 |
---|---|
[9252] LCS2 - C++ (0) | 2023.06.23 |
[2294] 동전 2 - C++ (0) | 2023.06.22 |
[1107] 리모컨 - C++ (0) | 2023.06.22 |
[2293] 동전 1 - C++ (0) | 2023.06.21 |