算法第三章作业
1. 任选作业题”单调递增最长子序列“、”挖地雷“、”编辑距离问题“中的一题分析。
-
单调递增最长子序列
1.1 根据最优子结构性质,列出递归方程式。
设a1,a2,…,ai是给出的序列,len[i]为a1-ai的最长单调递增子序列的长度, len[1]=1,len[i]=max{len[k]+1},k<i,ak<ai。
1.2 给出填表法中表的维度、填表范围和填表顺序。
表是一维的,len[n], 知道了底才能知道向上的怎么填,所以应该自左而右填表。
1.3 分析该算法的时间和空间复杂度
时间复杂度:每一个len[i]遍历一次数组, O(n^2)
空间复杂度:一维数组 O(n)
2. 你对动态规划算法的理解
动态规划的整体思想和分治法类似,也是将一个复杂问题分解成一个个简单的子问题来解决。动态规划的两个特点是1.满足最优子结构性质 2.很多计算是具有重复性的。
通常动态规划的解题步骤是 1.找出最优解的性质,分析其结构特征 2.递归定义最优解,列出递归方程式 3.计算最优解 构造最优解
在求最优解的时候,我们一般会用自顶向下直接递归,自底向上的填表方式,还有自顶向下的递归+备忘录的方式。
3. 说明结对编程情况
这段时间的结对编程有进步了,我们在实验课上的编程题也可以自己打出来了。就像最低通行费那道题目,我们一开始为了填表顺序,究竟是自顶向下还是自底向上讨论了很久,最后带入了一个具体例子分析才确定了填表方向。后来又发现了别的特殊情况,可以单独列出来求解。所以递归方程式一定要写正确,考虑到各种情况,特殊情况,否则打代码的时候会乱。我们结对编程现在默契了不少,结对编程还是有给我们两个人带来收获的。