本题中的动态规划dp[ i ][ j ]第一维只与i - 1有关 ,即只涉及两层, 那么可以用滚动数组来节省空间的消耗,会少许增加时间复杂度 。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N;
char str[5010],s[5010];
int dp[2][5010];
int main(){
// freopen("in.txt","r",stdin);
while(scanf("%d",&N) != EOF){
scanf("%s",str);
for(int i=0; i<N; i++)
s[i] = str[N-1-i];
memset(dp, 0, sizeof(dp));
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
if(str[i] == s[j])
dp[(i+1)%2][j+1] = dp[i%2][j] + 1;
else{
dp[(i+1)%2][j+1] = max(dp[i%2][j+1], dp[(i+1)%2][j]);
}
}
}
cout << N - dp[N%2][N] << endl;
}
return 0;
}