题意:插入最少的字母使其变成回文串。
只要将原字符串和其倒过来的字符串求最长公共字符串就OK了。
还要考虑就是内存过大的问题,我是将5000*5000变成2*5000的数组来解决的,
只要每次操作之后将把数组都往上移动一层,那么始终只使用2层的一维数组。
这是基于使用完那层的数组就不使用,并不影响后面的操作。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int dp[5][5001];
char str[5001],str1[5001];
int n;
while(scanf("%d%s",&n,str+1)!=EOF)
{
for(int i=n,j=1;i>=1;i--)
str1[j++]=str[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int x1=i;
x1=1;
if(str[i]==str1[j])
{
dp[x1][j]=dp[x1-1][j-1]+1;
}
else
dp[x1][j]=max(dp[x1-1][j],dp[x1][j-1]);
}
for(int j=1;j<=n;j++){
dp[0][j]=dp[1][j];
dp[1][j]=dp[2][j];}
}
printf("%d\n",n-dp[0][n]);
}
return 0;
}