题目:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
测试样例:"abc",3,"adc",3,5,3,100返回:8
思路:这种题目如果不使用动态规划基本无从着手,难度很大,时间复杂度很高,因此在思考时就应该从动态规划的角度去思考问题,动态规划有4部曲,逐步解决即可。对于这种能够将问题拆分成为2个维度的问题(A串作为纵向,B串作为横向),通常就是使用动态规划建立二维数组来进行解决。在建立二维数组时要注意是建立n*m的矩阵还是建立(n+1)*(m+1)的矩阵,关键是思考对于数组为””空串的情形是否要作为初始条件,即是否应该让空串作为初始条件,从实际意义上来理解,空串也是一种字符串,且与可能要求将空串编辑成为某个字符串,或者将某个字符串编辑成为空串,因此需要对字符串A,B从空串“”开始进行拆分考虑。但是实际上是否从空串或者0开始分解要看如果分解成为这种初始条件是否可以据此求出后面的所有情况的结果,即所求的第1行,第1列应当是有效的,能够据此求出后面的一系列情况,而不是固定的记住。
找零钱问题:
使用0~i种零钱凑出j,这里i从0即第1个数开始,j从0开始到aim共有aim+1个数值,之所以要从0考虑并且将使用0~i凑出j的值都记为1(其实这没有实际意义)是为了让之后的dp[i][j]计算时利用1恰好能够得到所需的结果,因此并不是先确定了1再求结果而是根据结果需要将这一列放到dp数组中并令其为1,其实这里1的本质是递归条件的边界条件,怎样算作一种方法呢?当aim=0时表示拼凑结束于是当前的零钱0~i算作一种方案。也可以记住,零钱问题是一个典型的动态规划问题,应该记住。