hzyqazasdf
思路 可以求str和其翻转后的字符串的 公共子序列(因为题目上是说,最少添加,那么添加的位置是由我们确定的),那么少的那几个字符都是要添加的。。
代码
#include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #define inf 0x3f3f3f #define M 1000+10 using namespace std; char str[M]; char ss[M]; int dp[M][M]; int main() { int n; scanf("%d",&n); while(n--) { scanf("%s",str); ss[strlen(str)]='\0'; int k=0; for(int i=strlen(str)-1;i>=0;i--) { ss[k++]=str[i]; } memset(dp,0,sizeof(dp)); for(int i=1;i<=strlen(str);i++) { for(int j=1;j<=strlen(str);j++) { if(str[i-1]==ss[j-1]) 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",strlen(str)-dp[strlen(str)][strlen(str)]); } return 0; }