http://poj.org/problem?id=1159
滚动数组或者用short 开5000*5000
取余可能慢 可以用变量取0 1来代替取余过程
q=0;q=1-q; 或者q=!q;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[5020];
char b[5020];
int dp[2][5020]={0};
int main()
{
int n;
cin>>n;
cin>>a;
for(int i=n-1;i>=0;i--)
b[i]=a[n-i-1];
int u=0;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(a[i]==b[j])
dp[(i+1)%2][j+1]=dp[i%2][j]+1; //如果字符相等,则继承前一行前一列的dp值+1
else
dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]); //否则,取上方或左方的最大dp值
if(u<dp[(i+1)%2][j+1])//注意要取最大的
u=dp[(i+1)%2][j+1];
}
cout<<n-u<<endl;
}