将原字符串倒置,然后与原字符串求最长公共子序列,
ans=n-dp[n][n]。 用滚动数组
#include "stdio.h"
#include "string.h"
#include "math.h"
int n;
char str[5010],str1[5010];
int dp[2][5010];
int find()
{
int i,j,a;
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++)
{
a=i%2;
for (j=1;j<=n;j++)
{
if (str[i-1]==str1[j-1])
dp[a][j]=dp[1-a][j-1]+1;
else
{
if (dp[1-a][j]>dp[a][j-1])
dp[a][j]=dp[1-a][j];
else
dp[a][j]=dp[a][j-1];
}
}
}
return dp[n%2][n];
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
getchar();
gets(str);
strcpy(str1,str);
strrev(str1);
printf("%d\n",n-find());
}
return 0;
}