队友想到一个比较简单的方法
字符串和本身反过来的字符串的最长公共子串就是删减后最长的回文子串
#include<bits/stdc++.h>
using namespace std;
int dp[1020][1020];
int main()
{
int N;
char s[1020];
scanf("%d",&N);
for(int kase=1;kase<=N;kase++)
{
memset(dp,0,sizeof(dp));
scanf("%s",s);
int len=strlen(s);
for(int i=1;i<=len;i++)
for(int j=1;j<=len;j++)
{
if(s[i-1]==s[len-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",len-dp[len][len]);
}
return 0;
}