算法第三章上机实践报告
最大子段和问题
1.1问题描述
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
1.2解题思路
需要用到动态规划,即当前的最大子段和为 上一个最大子段和加下一个数字 与 下一个数字 这两个之中的最大值,计算时需要用到上一步的结果避免重复计算,因此可以使用递推填表的方式逐步推出结果。
1.3递推式
tem[j]=Max{tem[j-1]+a[j],a[j]}
tem[0]=a[0] a[0]>0
tem[0]=0 else
1.4代码
该代码若用辅助空间存放数据,则采用从左往右的填表方式,但由于用tem值代替了填表过程,因此更为简便。
1.5算法分析
1.51空间复杂度:
由于该代码直接在存放数据的数组上修改,不需额外辅助空间。
1.52时间复杂度:
2.感想
做动态规划题目时,需要先知道递推式,由递推式得到填表方式,并由此做辅助空间存放结果。