只要将原字符串和其倒过来的字符串求最长公共字符串就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; }