第三章作业分析|3-2 单调递增最长子序列 (25分)

1. 第三章作业题“单调递增最长子序列”分析

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

  a[i] :原问题输入的数组。

    b[i] :用来记录从第0个到a[i]的单调递增最长子序列。从0到n初始化为1。

  b[i] = b[i-1]+1 ;  ( 0<j<i , a[i] > a[i-1]  )

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

    表的维度:用一个一维数组 ( b[i] )就可以来记录从第0个到a[]中第i个数的单调递增最长子序列。

  填表范围:从0到n。 

  填表顺序:从左往右。

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

  时间复杂度:双层循环,因此时间复杂度为 O(n^2)。

  空间复杂度:一维数组,因此空间复杂度为 O(n)。  

2. 你对动态规划算法的理解

  动态规划,是一个用来求解最优解的过程。基本思想也就是将原问题分解成若干个子问题,通过求解子问题来的得到原问题的解。为了节省时间,避免大量的重复的计算,还可以通过一个表来记录已经计算过的解,在需要时可以直接调用已经求过的解,就避免来重复计算。这样看和分而治之的办法很类似,但是和分治法不同的是,动态规划分解得到的子问题不是相互独立的,而是相互联系的。

  动态规划问题分为以下四步:

  1. 找到最优子结构,刻画其结构特征。
  2. 递归地定义最优解。
  3. 以自底向上的方式求得最优解。
  4. 构造最优解。

3. 说明结对编程情况

  结对编程的时候,在上课的时候我们是一起做的,在课后我们一般都是先各自思考做题,再一起讨论,这样两个人都有自己独立思考的过程,最后再一起讨论各自的想法,互看代码,解决不能通过的测试点。

  遇到卡住的bug,有时可能只是小小的问题,比如手快打错了字母之类的,自己很难发现,一起编程的时候就很容易看出来。同样在遇到一些问题,想法不一样的时候,两个人一起讨论的效率也比自己一个人琢磨要高一些,通过一起讨论,参考网上资料很快也可以做出来。

 

posted @ 2020-10-31 12:54  lynne_zz  阅读(137)  评论(0编辑  收藏  举报