真是无情,我都不知道为什么这样,感觉凑出来,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; }