#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
char s1_arr[1001];
char s2_arr[1001];
int memo[1001][1001];
int main() {
cin >> s1_arr >> s2_arr;
int s1Size = strlen(s1_arr);
int s2Size = strlen(s2_arr);
for (int i = 1; i <= s1Size; i++) {
for (int j = 1; j <= s2Size; j++) {
if (s1_arr[i - 1] == s2_arr[j - 1]) {
memo[i][j] = memo[i - 1][j - 1] + 1;
}
else {
memo[i][j] = max(memo[i][j - 1], memo[i - 1][j]);
}
}
}
cout << memo[s1Size][s2Size] << endl;
string result;
int i = s1Size, j = s2Size;
while (i > 0 && j > 0) {
if (memo[i][j - 1] == memo[i - 1][j] && memo[i - 1][j] == memo[i - 1][j - 1] && memo[i - 1][j - 1] == memo[i][j] - 1) {
result += s1_arr[i - 1];
i--;
j--;
}
else {
if (memo[i - 1][j] == memo[i][j]) {
i--;
}
else if (memo[i][j - 1] == memo[i][j]) {
j--;
}
}
}
reverse(result.begin(), result.end());
cout << result << endl;
return 0;
}
백준 9251 LCS (http://deque.tistory.com/13)문제에서 메모이제이션한 배열을 역추적하면 답이 나온다.
역추적할때 3가지 경우의 수가 있는데
3 4
4 4 -> 현재 index의 char가 LCS에 포함된다는 뜻이다. 4에서 3으로 대각선으로 index를 올린다
3 4
3 4 -> LCS에 포함되지 않는다. 4에서 4로 index를 올린다
3 3
4 4 -> 위와 마찬가지.
요로코롬 풀었다
끄읏
'코딩 > 알고리즘' 카테고리의 다른 글
백준 11004 K번째 수 (0) | 2017.06.02 |
---|---|
[C#] 백준 2749 피보나치수 3 (0) | 2017.05.28 |
백준 1932 숫자삼각형 (0) | 2017.05.27 |
백준 9461 파도반수열 (0) | 2017.05.27 |
백준 1912 연속합 (0) | 2017.05.27 |