真是无情,我都不知道为什么这样,感觉凑出来,n-原串和逆序串的LCS 就是答案。然后试一试的写了一发。就过了。。无情。。
dp用short定义就不会MTL 了。。。纪念一下自己稀里糊涂过了一题
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char save[5005];
char res[5005];
short dp[5005][5005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
save[0]=‘#‘;
scanf("%s",save+1);
for(int i=n;i>=1;i--)
res[n-i+1]=save[i];
res[0]=‘@‘;
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(save[i]==res[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d\n",n-dp[n][n]);
}
return 0;
}
原文:http://blog.csdn.net/u010709592/article/details/18941151