대충 DP로 푸는 문제라는건 알았는데 알고리즘 책에서 점화식 발견
i
랑 j
는 문자열 a
와 b
각각의 인덱스이다. lcs(i,j)
란 a
문자열 i
까지와 b
문자열 j
까지를 비교해서 구한 공통 부분 수열 최댓값이다.a[i]
와 b[j]
가 같다면 lcs(i-1, j-1) + 1
이 된다.i
나 j
가 0
이라면 같아도 최대 1
이니까 1
을 넣어줌a[i]
와 b[j]
가 다르다면 각각 문자열에서 하나 뺀 것 중 큰 값을 골라 넣는다.max(lcs(i-1,j), lcs(i,j-1))
이 됨0
이라면 0
이 아닌 문자열의 lcs
값을 넣어준다.#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
vector<vector<int>> lcs(a.size(), vector<int>(b.size()));
if (a[0] == b[0]) lcs[0][0] = 1;
else lcs[0][0] = 0;
for (int i = 0;i < a.size();i++)
{
for (int j = 0;j < b.size();j++)
{
if (i == 0 && j == 0) continue;
if (a[i] == b[j]) {
if (i == 0 || j==0)
{
lcs[i][j] = 1;
}
else {
lcs[i][j] = lcs[i - 1][j - 1] + 1;
}
}
else {
if (i == 0) {
lcs[i][j] = lcs[i][j - 1];
}
else if (j == 0) {
lcs[i][j] = lcs[i - 1][j];
}
else {
lcs[i][j] = max(lcs[i - 1][j], lcs[i][j - 1]);
}
}
}
}
cout << lcs[a.size() - 1][b.size() - 1] << endl;
return 0;
}