思路:
输入字符串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; }
时间: 2024-10-13 21:53:53