思路:
输入字符串S;设sum要插入字符的最小值
从两端出发前端x=0;后端y=L-1;
首先,如果S[0]!=S[L-1],此时要么在最前面添字符,要么在末尾添字符,sum++;(这是无法避免的)
然后,S[0]=S[L-1],此时前端x +1,后端y-1;
注意递归出口:前段>后端(x>y),此时为0;
递归算法最重要的是先明确函数的参数含义以及函数实现的功能。这题是实现在pos=x到pos=y这段字符要添加的最小字符数
还有数组保存递归结果的模板
#include<stdio.h>
#include<string.h>
#define min(a,b) (a<b?a:b)
char a[1001];
int f[1001][1001];
int dp(int x,int y)
{
if(f[x][y]!=-1)
return f[x][y];
if(x>=y)
{
f[x][y]=0;
return f[x][y];
}
if(a[x]==a[y])
{
f[x][y]=dp(x+1,y-1);
return f[x][y];
}
f[x][y]=min(dp(x+1,y),dp(x,y-1))+1;
return f[x][y];
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
scanf("%s",a);
memset(f,-1,sizeof(f));
printf("%d\n",dp(0,strlen(a)-1));
}
return 0;
}