实践题目

7-2 最大子段和

 

问题描述

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。


算法描述

利用一维数组存储待求序列。首先定义MaxSum函数,用于返回求出的最大子段和。

MaxSum函数中定义了两个整型变量sum和count,sum作用是保存到a[k]位置为止的最大子段和,count作用是保存到a[k]位置为止的所有元素的和。

每次循环,count值都要先与0做一次比较,若count<=0,则将a[k]的值赋给sum。若count>0,执行count+=a[k]语句。之后count要与sum比较,若count>sum,则将count值赋给sum,更新所储存的最大子段和。

 

算法时间及空间复杂度分析(要有分析过程)

时间复杂度:MaxSum函数中的for语句一共被执行了n次,所以算法的时间复杂度为O(n)。

空间复杂度:没有辅助空间,空间复杂度为O(1)。

 

心得体会(对本次实践收获及疑惑进行总结)

这次上机启发了对DP方法的深入思考,其实本质上还是把问题规模缩小,每个子问题都是问题的一个状态,而不同状态的集合就是问题解决的一个阶段。每个阶段问题的解决都建立在之前状态的问题的解决的基础上,是一种递推的思想。了解递推思想就能理解为什么动态规划方法包含最优子结构和重叠子问题的性质。

这次的不足是没有使用填表法,应该复习填表法,优化代码,并复习书上例题巩固理解。