dpするだけ。
const int N = 50 + 1;
int memo[N][N];
string S;
int rec(int i, int j)
{
int &ret = memo[i][j];
if (ret != -1) return ret;
if (j <= i) return ret = 0;
int mn = 1 << 30;
mn = min(mn, rec(i + 1, j) + 1);
mn = min(mn, rec(i, j - 1) + 1);
mn = min(mn, rec(i + 1, j - 1) + (S[i] != S[j]));
return ret = mn;
}
class PalindromeFactory {
public:
int getEditDistance(string ini)
{
S = ini;
const int size = S.size();
fill(&memo[0][0], &memo[N][0], -1);
int mn = rec(0, size - 1);
for (int i = 0; i < size; ++i) {
for (int j = i + 1; j < size; ++j) {
fill(&memo[0][0], &memo[N][0], -1);
swap(S[i], S[j]);
mn = min(mn, rec(0, size - 1) + 1);
swap(S[i], S[j]);
}
}
return mn;
}
};