1.题目要求
问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。 -- 引用自《百度百科》
2.分析
这道题是一个动态规划问题,可以使用分治法和递推法解决。我使用的是递推法。
3.项目目录结构
4.流程图
5.源代码
- 函数源代码
def deal(arrList:list)->int:
"""
:param arrList: 传入数列,参数类型为列表
:return:最大子数组之和
"""
flag = True
if len(arrList)==0:
return 0
for d in arrList:
if d>0:
flag = False
if flag:
return 0
Max = 0;dp = 0
for d in arrList:
if dp>0:
dp = dp + d
else:
dp = d
if dp>Max:
Max = dp
return Max
- 测试源代码
import unittest
from project1.main import deal
class MyTestCase(unittest.TestCase):
def test(self):
self.assertEqual(deal([1,2,-1,4]), 6)
self.assertEqual(deal([-2,11,-4,13,-20,-2]), 20)
self.assertEqual(deal([-1,-2,-3,-4]), 0)
if __name__ == '__main__':
unittest.main()
6.单元测试
我的测试实现了条件/组合覆盖
-
尝试条件组合覆盖集
① arr不合法
② arr合法,temp[i-1]>0,temp[i]>Max
③ arr合法,temp[i-1]>0,temp[i]<Max
④ arr合法, temp[i-1]<0,temp[i]>Max
⑤ arr合法, temp[i-1]<0,temp[i]<Max -
测试用例如下表
测试序号 | 测试用例 | 预期结果 |
---|---|---|
① | [-1,-2,-3,-4] | 0 |
② | [-2,11,-4,13,-20,-2] | 20 |
③ | [1,2,-1,4] | 6 |
- 测试结果