homework-02
问题分析
从第二部分开始分析:首先,假定我们已经选定了一个子矩阵作为该矩阵之前步骤的最优解,在继续进行之后的矩阵拓展过程中,我们新加入的只会是下一行(列)与当前最优解对应的一行(列),那么,我们不妨将矩阵多次压缩到一维,变成我们熟悉且容易处理的一维数组最大子序列和的问题。那么这样我们对于一个矩阵的每一行作为起始行a[i]将分别对该行以及将该行下面第1行,前2行...前j行直到最后一行压缩后所形成的一维数组分别进行求最大子序列和,通过每步比较得出最大值输出。
对于问题第三部分,表示实在是不会做,其他部分四处询问查看后勉强能自己动手写出来,这一部分看别人的一点都看不懂,还是应该好好练级。。。
到问题的第四第五部分,其实处理方法是类似的。对于纵向拓展,我们可以直接将原表扩充为2倍,扩充的数据填充在原表的下方,这样我们对于每一行,需要分析的就是从当前行起的h行(h为矩阵的高度)之内的所有压缩数组;而对于横向拓展,我们则向右拓展为原来的2倍,分析时则需要对于每一列开始向后分析l列(l为矩阵的宽度)为止;如果是备胎形状的矩阵,我们就将原表分别向右向下拓展,使之变成原来的4倍再分别进行分析,最后比较输出。
效率分析
直接进行最后一步的时间复杂度分析,对于备胎形状的矩阵,从纵向来说,我们对于每一行都要进行n(h)次分析,而对于未扩展的每次分析,我们都需要m(l)次比较,向右扩展后则需要m2次比较,所以最终的时间复杂度就是O(n2m2)。空间复杂度的话似乎用了好多临时空间和临时变量,但是到最后最占用空间的还是数表的读入部分,所以就是O(n2)。
作业感悟
最大的感悟就是我还是太年轻了,自己思考的时候总是想不通,钻牛角尖,在看了别人的之后发现除第三问以外还是可以处理的。代码编写过程中还是出了些问题的,尤其是对于这种输入方式没什么接触,debug各种不会,只有再次四处询问。路,还很长。。。