这题是要求至少脱落几个种子(也就是字符)能够使原来回文串变为当前的字符串,首先由于回文串是关于一个字符中心对称的,因此增加几个种子能使当前字符串变为原来的回文串转化为去掉几个种子能使当前字符串变为一个回文串,从而脱落种子的最小值就是字符串长度-字符串的最大回文串长度。
![](https://i-blog.csdnimg.cn/blog_migrate/ab67ee49756d0c071f94683d3abcaaa5.png)
#include <iostream>
#include <cstring>
using namespace std;
const int N=1010;
int f[N][N];
char s[N];
int main()
{
scanf("%s",s);
int n=strlen(s);
for(int len=1;len<=n;len++)
{
for(int l=0;l+len-1<n;l++)
{
int r=l+len-1;
if(len==1) f[l][r]=1;
else
{
if(s[l]==s[r]) f[l][r]=f[l+1][r-1]+2;
if(f[l][r-1]>f[l][r]) f[l][r]=f[l][r-1];
if(f[l+1][r]>f[l][r]) f[l][r]=f[l+1][r];
}
}
}
printf("%d\n",n-f[0][n-1]);
return 0;
}