动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;
对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。
动态规划算法将问题的解决方案视为一系列决策的结果。
dp[i][j]表示从两个字符串首部各自到str1[i]和str2[j]为止的子串需要的编辑距离。eg:dp【2】【3】 表示str1 的前2个字符,转化成dp的前三个最少需要几步
初始状态:
假设我们可以使用d[ i , j ]个步骤,表示将串s[ 1…i ] 转换为串t [ 1…j ]所需要的最少步骤个数,
那么,在最基本的情况下,即在 i 等于 0 时,也就是说串 s 为空,那么对应的d[ 0 , j ] 就是 增加 j 个字符,使得 s 转化为 t,在 j 等于 0 时,
也就是说串 t 为空,那么对应的 d[ i, 0] 就是 减少 i 个字符,使得 s 转化为 t。
状态转移: dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;其含义是从当前位置的上方,左侧,斜上方。之前的三种状态中选择最小需要编辑的距离加上这一步的编辑距离。
eg,dp【1】【2】的求解,即字符串1为h,字符串2为ro,dp【1】【2】的值可以从上方dp【0】【2】加一步过来,
即从ro与空变为ro与h,也可以从左侧dp【1】【1】 r,h加一步变为r0与h,也可以从左上方r空加一部变为ro与h,哪个小选哪个。
对于这一步的编辑距离。要看此时求解的末尾是否相同,egdp【2】【2】直接等于对角线位置dp【1】【1】即可.表示对于这个字符不需要编辑。