做这题的时候网上荡了个公式:最少需要补充的字母数=原序列S的长度—S和S'的最长公共子串长度//其中s'为s的逆序。不要问我为什么,我也不知道是为什么。大神们没说,我还要再想想。
代码如下
#include<stdio.h>
#include<string.h>
void main()
{
char a[5005],b[5005];
int c[2][5005];
int n,i,j;
scanf("%d",&n);
scanf("%s",a);
j=0;
for(i=n-1;i>=0;i--)
b[j++]=a[i];
for(i=0;i<=n;i++)
c[0][i]=0;
for(j=0;j<=n-1;j++)
{
for(i=0;i<=n-1;i++)
{
if(a[i]==b[j])
c[1][i+1]=c[0][i]+1;
else
c[1][i+1]=c[1][i]>c[0][i+1]?c[1][i]:c[0][i+1];
}
for(i=1;i<=n;i++)
c[0][i]=c[1][i];
}
printf("%d\n",n-c[1][n]);
}