给定一个长度为n的字符串,增加或删减一个字符都为一次操作,求最小操作多少次可以使它成为一个回文串。
有这样一个结论,最小回文代价=字符串长度-字符串和它的反串的最大相等子串长度。
因为字符串和它的反串的最大相等子串就是原字符串的最长对称序列,剩下的字符都删除或者添加对称字符就是最小代价了。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[1007][1007];
int main()
{
char s[1007];
scanf("%s",s+1);
int n=strlen(s+1);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i]==s[n-j+1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d",n-dp[n][n]);
return 0;
}