有人知道这个代码的原理以及用处吗
#include <bits/stdc++.h>
using namespace std;
#define MAXN 5005
char str1[MAXN],str2[MAXN];
int maxlen[2][MAXN];
int main(){
int n;
while(cin>>n){
for(int i=1;i<=n;i++){
cin>>str1[i];
}
str1[n+1]='/0';
for(int i=1;i<=n;i++){
str2[i]=str1[n+1-i];
}
memset(maxlen,0,sizeof(maxlen));
int x=0;
for(int i=1;i<=n;i++){
x=1-x;
for(int j=0;j<=n;j++){
if(str1[i]==str2[j]){
maxlen[x][j]=maxlen[1-x][j-1]+1;
//cout<<maxlen[x][j]<<endl;
}else{
int len1=maxlen[x][j-1];
int len2=maxlen[1-x][j];
//cout<<len1<<" "<<len2<<endl;
if(len1>len2){
maxlen[x][j]=len1;
}else{
maxlen[x][j]=len2;
}
}
}
}
cout<<n-maxlen[x][n]<<endl;
}
return 0;
}