문제
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
입력
첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.
출력
첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를, 둘째 줄에 LCS를 출력한다.
LCS가 여러 가지인 경우에는 아무거나 출력하고, LCS의 길이가 0인 경우에는 둘째 줄을 출력하지 않는다.
int dp[1001][1001] = { 0 };
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string m, n;
cin >> m >> n;
for (int i = 1; i <= m.length(); i++)
{
for (int j = 1; j <= n.length(); j++)
{
if (m[i - 1] == n[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[m.length()][n.length()] << endl;
string str;
int a = m.length();
int b = n.length();
while (a > 0 && b > 0)
{
if (dp[a][b] == dp[a - 1][b])
a--;
else if (dp[a][b] == dp[a][b - 1])
b--;
else
{
str.push_back(m[a - 1]);
a--;
b--;
}
}
for (int i = str.length() - 1; i >= 0; i--)
{
cout << str[i];
}
}