第三章作业

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问题比较陌生,经过讨论学习后,双方都能完成教学题目,并且在此过程中积累经验。

posted @ 2020-10-27 21:50  阿柴啊啊啊·  阅读(101)  评论(0编辑  收藏  举报