算法第三章学习小结

单调递增最长子序列

1.作业题目分析

 

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

dp[i]是a0到ai(0 <= i < n)中以第i个数字结尾的最长单调子序列数

递归方程式: dp[i] = max{ dp[j]+1 }

      (1 <= j < i,a[j] < a[i])

 

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

(1)维度:一维

dp[i]用于记录最长单调子序列数,简单的一维数组即可满足需求。

(2)填表范围:1~n

由题得dp[2]由dp[1]所推得出,即dp[n]需要借助dp[n-1]。

(3)填表顺序:自左向右

因为递归方程式中1 <= j < i,且dp[n]由dp[n-1]得出,所以需要从左往右按顺序填表。

 

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

(1)时间复杂度:O(n^2)

建立dp[i]数组时,填需要1~n的循环,进行表内数值比较时需要遍历dp数组,时间量级为n,所以T(n) = O(n^2)

(2)空间复杂度: O(n)

申请了空间大小为n的dp辅助数组,所以S(n) = O(n)

 

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

动态规划主要用来解决一些希望找到问题最优解的优化问题。当子问题反复出现,这些子问题还会包含更小的子问题,动态规划会去解决更小的子问题,之后我们可以将结果计算记录在表格中,在之后的计算中可以将这些记录作为问题的原始解。

使用条件:

  • 优化子结构

    一个问题的优化解包含了子问题的优化解

    缩小子问题集合,只需那些优化问题中包含的子问题,降低实现复杂性

  • 重叠子问题

    在问题的求解过程中,很多子问题的解将被多次使用。

特点:

  • 把原始问题划分成一系列子问题
  • 求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间
  • 自底向上地计算
  • 整体问题最优解取决于子问题的最优解

  

3. 说明结对编程情况

本次和颖芳在课上完成了“最低通行费”,由题建立了一个辅助的二维数组并写出递归方程式,相较以往上机不同的是我来敲代码,颖芳在一旁理解。顺着老师之前讲解例题的思路很快便完成了“最低通行费”。然而在做第二题时,保留着上一题的固有思路,因为在建立不出一个二维数组卡了很久,最终才知道一维数组就足以解决这个问题。

 

posted @ 2020-11-01 10:25  Takoyaki  阅读(126)  评论(0编辑  收藏  举报