NYOJ_37_回文字符串
首先,我们把字符串反转,然后用反串和原串求最大公共子序列,再用字符串长度减去最大公共子序列的长度就是答案,我们还可以用滚动数组优化内存
状态转移方程:
(i长度的a串和j长度的b串的最长公共子序列长度)
1.dp[i-1][j-1]+1 a[i]=b[j]
dp[i][j]=
2.max(dp[i][j-1],dp[i-1][j]) a[i]!=b[j]
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int re[2][1005];//使用滚动数组优化了空间 int main() { int t,i,j; string a,b; scanf("%d",&t); while(t--) { cin>>a; b=a; reverse(a.begin(),a.end()); memset(re,0,sizeof(re)); for(i=0;i<a.length();++i) for(j=0;j<b.length();++j) { if(a[i]==b[j]) { re[(i+1)&1][j+1]=re[i&1][j]+1; } else re[(i+1)&1][j+1]=re[i&1][j+1]>re[(i+1)&1][j]?re[i&1][j+1]:re[(i+1)&1][j];//条件表达式是最省时间的 } printf("%d\n",a.length()-re[(a.length())&1][b.length()]); } return 0; }