第三章- 动态规划
一、作业题目分析——单调递增最长子序列
1. 递归方程如图: /*m[i]表示以第i个数字结尾的最长序列数*/
2. 填表法分析
(1)填表法中表的维度: 一维
【表m[i]记录以第i个数字结尾的最长序列数,每次计算遍历的范围都是1~I,这种情况下,一维数组便可以满足】
(2)填表范围:1~n
【根据递归方程,想要计算表m[2]需要知道m[1]】
(3)填表顺序: 自左向右
【根据递归方程,1 <= j < i ,所以想求m[i] 需要知道m表的前i-1个的值,所以需要自左向右填 】
二、算法效率分析
1. 时间复杂度为O(n^2)
【填表m需要一层1~n的循环,而在填表的每个格子m[i]时,又需要遍历m表的1~(i-1)个数(最坏情况下需要遍历1~(n-1),所以T(n) = O(n^2) )】
2. 空间复杂度为O(n)
【需要申请长度为n的辅助数组空间来填表m, 所以S(n) = O(n)】
三、动态规划算法的理解
1、 动态规划有点像分治法,将需求解的大问题分解成小的子问题,然后通过子问题的计算来求出大问题的解,但是在求解过程分治法的子问题是独立的,而动态规划会出现很多重复的子问题,为了避免重复的子问题计算,动态规划利用表来记录已解决的子问题,提高算法效率。我觉得动态规划最重要的是正确的给出问题表示以及递归方程的建立。这两个一旦明确,问题其实就很好解决。
2、 用动态规划解决最优化问题的步骤
(1)问题结构分析:
给出问题表示(比如单调递增最长子序列中,问题表示则为m[i]: 表示以第i个数字结尾的最长序列数)
——>明确原始问题(比如单调递增最长子序列中,原始问题则为m[n])
(2)建立递推关系:
分析最优(子)结构(最优子结构性质: 问题的最优解由相关子问题最优组合而成,子问题可以独立求解)
——> 构造递推关系式
(3)填表:
根据递归关系式确定计算顺序——>依次求解问题
(4)最优方案追踪(可以利用一个数组来记录追踪,从结果逆推出方案顺序)
四、结对编程情况
结对编程搭档:蔡晓娜
本章结对编程时。
(1)第一道3-1 最低通行费的编程进行的很顺利,我跟晓娜先是进行讨论要如何解决以及考虑边界问题,晓娜负责打代码,然后我负责写出递归方程并在旁看晓娜打代码(课后自己重新打了一遍代码)。
(2)因为第一道比较顺利,时间充裕,于是我们进行第二道题3-2 单调递增最长子序列的讨论,这一道就陷入困境,问题出在没有对问题进行结构分析,给出清晰的问题表示已经确定填表的维度,然后一直写不出递归方程,最后晓娜用了一种我现在还是有点不懂的代码思路来解决,虽然过了测试点,但是不是题目想要我们用的解决方案,下课吃饭有讨论以及重新打的时候我们有线上进行讨论,但是还是没很好解决。感觉就是我的思想被二维的禁锢了,一直不懂怎么用一维的样子,或者是没好好分析想的太复杂,直到老师上课的讲解,才恍然大悟。