算法第三章学习小结
单调递增最长子序列
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. 说明结对编程情况
本次和颖芳在课上完成了“最低通行费”,由题建立了一个辅助的二维数组并写出递归方程式,相较以往上机不同的是我来敲代码,颖芳在一旁理解。顺着老师之前讲解例题的思路很快便完成了“最低通行费”。然而在做第二题时,保留着上一题的固有思路,因为在建立不出一个二维数组卡了很久,最终才知道一维数组就足以解决这个问题。