一、分析作业——单调递增最长子序列

1.1  根据最优子结构性质,列出递归方程

设:a[n]保存用户输入的n个数,b[i]表示当前累计递增的数量,max表示当前最大值

递归方程:  if(a[ i ] > a[ j ] && b[ i ] < b[ j ] + 1) {b[ i ] = b[ j ] + 1;}

                    if(max < b[ i ]) {max = b[ i ] ;}

 

1.2  给出填表法中表的维度、填表范围和填表顺序

①表的维度:一维

②填表范围:[1,n]

③填表顺序:从左到右(从小到大)

 

1.3分析该算法的时间和空间复杂度

(1)时间复杂度:遍历数组的所有值所需时间量级为n,再次遍历数组逐个比较以得到递增最长子序列的时间量级也为n,故算法复杂度为O(n^2);

(2)空间复杂度:由于数组所需的表以及所填的表均为一维的表,故空间复杂度为O(n)。

 

 

二、如何理解动态规划

(1)动态规划的四步法能够较好地分析动态规划问题

  step1:找出最优解的性质,刻画其结构特征;

  step2 :递归地定义最优值;

  step3:自底向上方式计算出各子结构的最优值;

  step4:构造最优解;

  其中,什么叫做“自底向上”,我的理解是从构成原问题的子问题入手,找到子问题的相似之处,把他们用递归公式串联起来,再形成原问题的最优解。“底”即为基础,“上”即为越来越接近原问题。

(2)与分治法的区别

  动态规划有效防止了子问题的重复计算,每个问题只计算一次,避免了重复计算子问题,利用填表来记录已经被解决的子问题的解,提高了算法效率。

 

三、编程结对情况

搭档:任宜炫

这次上机相对以往几次较为容易,因为我和搭档在动手编程之前,先分析问题,将递归方程写出,在编程过程中结合我们遇到的问题进行改进,最终比较顺利的完成了上机实验。