9251_LCS
링크
https://www.acmicpc.net/problem/9251
풀이
처음에 편의를 위해서 0행과 0열을 0으로 세팅해줍니다.
DP[i][j]를 LCS(i까지의 string2, j까지의 string1)라고 정의합시다.
LCS로 비교하는 string의 마지막 문자가 같다면,
LCS(i까지의 string2, j까지의 string1) = LCS(i-1까지의 string2, j-1까지의 string1) + 1이 됩니다.
즉, if(string2[i] == string1[j]) DP[i][j] = DP[i-1][j-1] + 1이 됩니다.
LCS로 비교하는 string의 마지막 문자가 다르다면,
LCS(i까지의 string2, j까지의 string1) = max(LCS(i-1까지의 string2, j까지의 string1), LCS(i까지의 string2, j-1까지의 string1))이 됩니다.
즉, if(string2[i] != string1[j]) DP[i][j] = max(DP[i-1][j], DP[i][j-1])이 됩니다.
이렇게 구하게 되면 마지막 DP[n][m]이 우리가 구하고자 하는 LCS(string2, string1) == LCS(string1, string2)가 되는 것이죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//9251_LCS #include <iostream> #include <algorithm> #include <string> using namespace std;
int DP[1002][1002]; // LCS(i까지의 string2, j까지의 string1)
int main() { string string1, string2; int i, j;
cin >> string1 >> string2;
for (i = 1; i <= string2.size(); ++i) { for (j = 1; j <= string1.size(); ++j) { if (string1.at(j - 1) == string2.at(i - 1)) DP[i][j] += DP[i - 1][j - 1] + 1; else DP[i][j] = max(DP[i - 1][j], DP[i][j - 1]); } }
for (i = 0; i <= string2.size(); ++i) { for (j = 0; j <= string1.size(); ++j) { cout << DP[i][j] << " "; } cout << endl; }
cout << DP[i - 1][j - 1] << endl;
return 0; } |
이렇게 해서 DP 표를 출력해보면, 위의 사진과 동일한 결과를 출력합니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//9251_LCS #include <iostream> #include <algorithm> #include <string> using namespace std;
int DP[1002][1002]; // LCS(i까지의 string2, j까지의 string1)
int main() { string string1, string2; int i, j;
cin >> string1 >> string2;
for (i = 1; i <= string2.size(); ++i) { for (j = 1; j <= string1.size(); ++j) { if (string1.at(j - 1) == string2.at(i - 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[i - 1][j - 1] << endl;
return 0; } |
참고
'PS > BOJ' 카테고리의 다른 글
[백준 BOJ][sort] 10989 수 정렬하기 3 (1) | 2018.07.24 |
---|---|
[백준 BOJ][sort] 2750 수 정렬하기 (0) | 2018.07.24 |
[백준 BOJ][DP] 2156 포도주 시식 (0) | 2018.06.03 |
[백준 BOJ][DP] 1463 1로 만들기 (1) | 2018.06.03 |
[백준 BOJ][DP] 11052 붕어빵 판매하기 (0) | 2018.06.02 |