南洋理工oj 37

思路:

输入字符串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;
}

 

转载于:https://www.cnblogs.com/clanguageweaver/p/6710611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值