题目链接:51Nod
思路:处理回文的东西许多时候要考虑反转一下与原串相比。对于本题,发现一个结论:原串与逆序串的LCS扣除后剩下的串长度恰好是我们要构造对称的最少长度,因为这样找LCS相当于回文串中找后面的一个匹配,当然LCS是不连续的,而回文要求连续,这样扣除一下恰好会是一个连续的结果。
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005], len1, len2;
string str1, str2;
int main() {
cin >> str1;
str2 = str1;
len1 = len2 = str1.size();
reverse(str2.begin(), str2.begin());
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++)
for (int j = 1; j <= len2; j++)
if (str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i-1][j-1] = max(dp[i-1][j], dp[i][j-1]);
cout << len1-dp[len1][len2] << endl;
return 0;
}