线性动态规划,增加的字符数应该是字符串长度减去字符串和其反串的最长公共子串长度的差值,注意缩减空间复杂度
#include <stdio.h>
int buf1[6000];
int buf2[6000];
char src[6000];
char inverse[6000];
int __max(int a, int b){
return a>b ? a:b;
}
void func(int len){
int *dp_old, *dp_new, *tmp;
int i, j, max;
dp_old = buf1;
dp_new = buf2;
max = 0;
for(j=0; j<=len; j++)
dp_old[j] = 0;
for(i=1; i<=len; i++){
dp_new[0] = 0;
for(j=1; j<=len; j++){
if(src[i] == inverse[j])
dp_new[j] = dp_old[j-1]+1;
else
dp_new[j] = __max(dp_old[j], dp_new[j-1]);
if(max < dp_new[j])
max = dp_new[j];
}
tmp = dp_old;
dp_old = dp_new;
dp_new = tmp;
}
printf("%d\n", len-max);
}
int main(void){
int len, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d", &len) != EOF){
scanf("%s", src+1);
for(i=1; i<=len; i++){
inverse[i] = src[len+1-i];
}
func(len);
}
return 0;
}