题目大意:给定一段字符串,问最少能添加多少个字母使得这个字符串能够成为回文字符串;
题目解析:区间dp,定义dp[i][j]为把区间[i,j]中的字符全部转化为回文字符串所需要的最少次数,那么我们dfs记忆化搜索就好了;
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int inf=0x3fffffff;
char s[110];
int dp[110][110];
bool vis[110][110];
int dfs(int l,int r)
{
int ans=inf;
if(l>=r) return 0;
if(vis[l][r]) return dp[l][r];
if(s[l]==s[r])
ans=min(ans,dfs(l+1,r-1));
else
ans=min(dfs(l+1,r)+1,dfs(l,r-1)+1);
vis[l][r]=1;
return dp[l][r]=ans;
}
int main()
{
int cas,c;
scanf("%d",&cas);
for(c=1;c<=cas;c++)
{
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
scanf("%s",s+1);
printf("Case %d: %d\n",c,dfs(1,strlen(s+1)));
}
return 0;
}