题面
题意
给一个字符串,问最少加入多少个字符可以使它变为回文串.
方法
可以从最左端和最右端开始比较,从两端入手(两端相同),dp[i][j]表示i到j这一段的最少次数,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1,若两端相等则可以将结果与dp[i+1][j-i]比较.
主要是通过缩小范围来一步一步地推出答案
代码
#include<bits/stdc++.h>
using namespace std;
int T,TT,dp[110][110];
char a[110];
int dfs(int u,int v)
{
if(v<=u) return 0;
if(dp[u][v]!=-1) return dp[u][v];
int res;
res=min(dfs(u+1,v),dfs(u,v-1))+1;
if(a[u]==a[v]) res=min(res,dfs(u+1,v-1));
dp[u][v]=res;
return res;
}
int main()
{
int i,j;
cin>>T;
TT=T;
while(T--)
{
scanf("%s",a+1);
memset(dp,-1,sizeof(dp));
printf("Case %d: %d\n",TT-T,dfs(1,strlen(a+1)));
}
}