알고리즘/백준 알고리즘
[BOJ] 5502 팰린드롬
sung960929
2021. 1. 7. 17:21
문제 링크
모든 알고리즘 문제는 C++로 구현되어 있습니다.
주어진 문자열과 이를 뒤집은 문자열의 LCS를 구한 뒤, 전체 문자열 길이에서 이를 빼주면 답을 구할 수 있는 문제이다. 방법을 알면 구현 자체는 쉽지만, 방법을 떠올리기가 어려워 애를 먹었던 문제였다. 한번 경험해봤으니 다음에 비슷한 문제가 나오면 LCS로 접근을 해봐야겠다.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int dp[5000][5000];
int main() {
int i, j, n;
string s, sRev;
cin >> n >> sRev;
s = sRev;
reverse(sRev.begin(), sRev.end());
for (i = 0; i < n; i++) {
if (s[i] == sRev[0] || (i > 0 && dp[0][i - 1] == 1)) dp[0][i] = 1;
if (sRev[i] == s[0] || (i > 0 && dp[i - 1][0] == 1)) dp[i][0] = 1;
}
int ret = 0;
for (i = 1; i < n; i++) {
for (j = 1; j < n; j++) {
if (sRev[i] == s[j]) dp[i][j] = dp[i - 1][j - 1] + 1;
dp[i][j] = max(dp[i][j], max(dp[i - 1][j], dp[i][j - 1]));
ret = max(ret, dp[i][j]);
}
}
cout << n - ret;
}