算法第三章上机实践报告
1. 实践报告任选一题进行分析
1.1 问题描述
1.2 算法描述
输入一个数组,该数组有n个数值,初始化maxSum和sum,将数组从左往右遍历,依次加num赋给sum,如果sum的值大于maxSum,则将sum赋给maxSum,即寻求序列如a[i]+a[i+1]+…+a[j]的子段和的最大值;如果sum小于0,则将0赋给sum,即所给的整数均为负数时,定义子段和为0。
1.3 问题求解:
1.1.1 根据最优子结构性质,列出递归方程式,
X[i]+D[i+1], if D[i+1]>0;
D[i]=
X[i], if D[i+1]<=0;
1.1.2 给出填表法中表的维度、填表范围和填表顺序。
一维表:从a[0]到a[n]
填表:从左往右依次填入a[i]的值,从a[0]开始填
1.1.3 分析该算法的时间和空间复杂度
时间复杂度:O(n),因为从左往右走了一遍只遍历了一次数组
空间复杂度:O(n),因为只占用了一维表
1.3 心得体会(对本次实践收获及疑惑进行总结)
刚开始对D[i]的理解出现偏差,所以对递归方程式理解错误,这次实践让我明确了D[i]指的是什么。
D[i]是以第i个数字开头的最大字段和
如:D[1] = { 1 3 5 7 ... }
D[2] = { 3 5 7 ... }
2. 你对动态规划算法的理解和体会
动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是互相独立的。
动态规划步骤设计:1. 找出最优解的性质,并刻画其结构特征
2. 递归地定义最优值
3. 以自底向上的方式计算最优值
4. 根据计算最优值时得到的信息,构造最优解