LSC状态转移方程:
L[i][j]=max(L[i][j-1],L[i-1][j]);(s1[j]!=s2[i])
L[i][j]=0; (j=0||i=0)
L[i][j]=L[i-1][j-1]+1;(s1[j]==s2[i])
滚动的数组滚得有点粗糙
#include"iostream"
#include"algorithm"
#include"string"
using namespace std;
const int maxlen=5000+20;
int flag[2][maxlen];
int n;
string s1,s2;
int LCS()
{
int m=1;
for(int i=0;i<n;i++) //s1行
{
for(int j=0;j<n;j++)
{
//cout<<flag[0][j]<<" ";
if(s1[j]==s2[i])
flag[1][j+1]=flag[0][j]+1;
else
flag[1][j+1]=max(flag[1][j],flag[0][j+1]);
//cout<<flag[1][j]<<" ";
}
for(int j=0;j<n;j++) //开始滚动了。。。
{
flag[0][j]=flag[1][j];
}
//cout<<endl;
}
return flag[1][n];
}
int main()
{
//freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(flag,0,sizeof(flag));
cin>>s1;
s2=s1;
reverse(s2.begin(),s2.end());
//cout<<s1<<" "<<s2<<endl;
cout<<n-LCS()<<endl;
}
return 0;
}