第三章作业
1.1 根据最优子结构性质,列出递归方程式
(1)删除操作,比如当 a[ 1 — i - 1 ]的字符与 b[ 1 — j ] 已经匹配好了,我们看向 a[i] ,如果此时若继续 a[ 1 — i ] 与 b[ 1 — j ]匹配,则执行删除操作,即删除 a[i]
(2)添加操作,当 a[ 1 — i ]已经与 b[ 1 — j - 1 ]相匹配了,若我们看向 b[j]时,此时要想 a[i + 1] 与 b[j] 匹配,则要在 a[i + 1] 处增加与 b[j] 一样的字符。
(3)替换操作,当 a[ 1 — i - 1 ] 与 b[ 1 — j - 1 ] 相匹配,若 a[i] != b[j] ,此时就要将 a[i] 替换成 b[j]
当 i = 0 , f[0][j] = j ;
当j = 0 , f[i][0] = i;
当i != 0 && j !=0 ,f[i][j] = min(f[i][j] , f[i - 1][j - 1] + (a[i] != b[j] ))
1.2 填表法中表的维度、填表范围和填表顺序
由于使用二维数组表示集合状态,因此维度是二维,填表范围为 0 <= x <= strlen(a), 0 <= y <= strlen(b),由于递推式中要先得到f[i - 1][j - 1],因此是从左上角一
填到右下角。
1.3 分析该算法的时间和空间复杂度
数组状态数为 m (strlen(a)) * n (strlen(b)) , 转移的复杂度为O(1) ,所以时间复杂度为O(m * n),空间复杂度为 n * m。
2. 你对动态规划算法的理解
动态规划,我认为最重要的是想好状态表示,一般来说用数组来表示,先从一维开始,如果表示不了就升维。一般来说,只要想好了状态表示,递推式也就不难
推出了。接下来最后一步就是边界问题。一般如果出现 i - 1 或者 j + 1 的式子,要特别注意 f[0][j] 以及 f[i][m] ,或者注意第一行第一列以及对角线。这些可能要
附上初始值。
3. 说明结对编程情况
一开始伙伴对于DP问题比较陌生,经过讨论学习后,双方都能完成教学题目,并且在此过程中积累经验。