动态规划入门之求字符串距离

题目:求字符串之间距离
要求:设有字符串X,称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为“abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其它任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为0。在字符串A、B的所有扩展串中,必定存在两个等长的扩展串A1、B1,使得A1与B1之间的距离达到最小,将这一距离定义为字符串A、B的距离。请编写程序,求出字符串A、B的距离。

思想:这道题目其实可以用一个二维数组来求解的,在分析这道题之前,我想先分析一道用一维数组来借的一道题。

题目的大致意思就是我们手上有3种硬币,面值分别为1元,3元,5元。问怎么用最少的硬币个数来凑11元。

对于这个凑11元,我们可以从最开始的想法来想,假设是凑0元,那么肯定是0个硬币;如果是1元,那么只要一个1元硬币;2元的话2个;3元是1个3元硬币,这个过程又怎么让计算机思考呢?

这就是我今天要说的动态规划(由于我也是小白,只能说点入门的东西),我们让计算机这么想这个问题,先创建一个数组int   a[12](因为我的题目是凑11元,然后后有0-11  12个数字,故取12),a[i]中的i表示的意思凑多少元,a[i]表示凑i元最少的硬币数目,显然a[0]=0       a[1]=1    a[2]=2,对于a[3]我们应该这么想,凑3元有两种方法,第一种是在2元的基础上加一个1元硬币,此时a[3]=a[2]+1;还有一种方法是在0元的基础上加一个3元硬币,此时a[3]=a[0]+1(当然有些人会觉得肯定用3元的时候硬币少啦,这么想肯定是没错的,大家可以看看这个例子,假设这里没有5元硬币的话,我们凑5元的话可以是两元加一个3元硬币3个,也可能是四元加一个1元硬币,都是3个,这里为了逻辑的严密性故给出两种。)。所以这个时候的a[3]应该是上面两种情况中小的那一种,当然当i元大于等于3元的时候也要这么思考,可能是由i-1元加一个1元硬币,也可能是i-3加一个3元硬币,然后在这两种中取小。当然对于5元的硬币思考也

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值