题目:求字符串之间距离
要求:设有字符串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元的硬币思考也是这样的。
具体代码如下
#include<iostream>
using namespace std;
int q(int i)
{
int a[i+1<