首先,我们把字符串反转,然后用反串和原串求最大公共子序列,再用字符串长度减去最大公共子序列的长度就是答案,我们还可以用滚动数组优化内存
状态转移方程:
(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; }