算法第三章上机实践报告

最大子段和问题

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时间复杂度:

O(n)

 

2.感想

做动态规划题目时,需要先知道递推式,由递推式得到填表方式,并由此做辅助空间存放结果。

posted @ 2021-10-31 20:08  魏芃枫  阅读(29)  评论(0编辑  收藏  举报