dp,LCS的应用
//求出输入的字符串和他的回文串的LCS的长度l,用此字符串的长度n-l,即得结果
//还有存储的问题,如果用f[maxn][maxn]存储的话会超内存,可通过滚动数组优化
//因为求当前f[i][j]时可能会用到f[i-1][j-1],f[i-1][j],f[i][j-1],观察发现i,j
//只用到当前的i,i-1,二者可用奇偶性区分,只需用一个f[i%2][j]就可表示,为什么
//不能用f[i][j%2]表示,可通过判定求当前的f[i][j%2]时,f[i-1][j%2]并不是f[i-1][j]
//所以这样做是错误的,但前者却可以通过类似的方法判是正确的,所以只需f[2][maxn]的空间
//就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=5002;
const int inf=1<<30;
char s[maxn],p[maxn];
int f[2][maxn];
int main()
{
int n;
while(cin>>n)
{
getchar();
int i,j;
char c;
for(i=1;i<=n;i++)
{
scanf("%c",&c);
s[i]=c;p[n+1-i]=c;
}
s[n+1]='\0';p[n+1]='\0';
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
f[i%2][j]=inf;
if(s[i]==p[j])
f[i%2][j]=f[(i-1)%2][j-1]+1;
else
f[i%2][j]=f[(i-1)%2][j]>f[i%2][j-1]?f[(i-1)%2][j]:f[i%2][j-1];
}
}
cout<<n-f[n%2][n]<<endl;
}
return 0;
}