有人说:“最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度”(S'为原序列S的逆序列) orzorzorzorz(才发现这个有点像人体蜈蚣)自己想出来一个o(n^3)的方法有空再敲出来试试。
还有采用滚动数组,不然5000*5000会超。自己写的很短啊
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[2][5001];
char a[5001];
int main(){
int n;
int i,j;
while(scanf("%d",&n)!=EOF){
memset(a,0,sizeof(f));
scanf("%s",a);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(a[i-1]==a[n-j])
f[i%2][j]=f[1-i%2][j-1]+1;
else
f[i%2][j]=max(f[1-i%2][j],f[i%2][j-1]);
}
printf("%d\n",n-f[n%2][n]);
}
return 0;
}