zoukankan      html  css  js  c++  java
  • 2019软件工程第三次作业

    最大连续子数组和(最大子段和)

    • 问题描述
      给定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。-- 引用自《百度百科》

    问题分析

    • 采用动态规划的方法
    • 设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以第i-1个元素结尾且和最大的连续子数组sum[i-1]加上这个元素a[i],要么是只包含第i个元素a[i]。
      即递推公式为:sum[i]=max(sum[i−1]+a[i],a[i])
    • 通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。
    • 由于每次运算只需要前一次的结果,因此并不需要像普通的动态规划那样保留之前所有的计算结果,只需要保留上一次的即可,因此算法的时间和空间复杂度都很小。
      算法思路参考自
      codingnet地址

    源代码

    def maxsum(arr):
        max=0
        sum=arr.copy()
        if len(arr)==0:
            return 0
        else:
            for i in range(1,len(arr)):
                if sum[i-1]>0:
                    sum[i]=sum[i-1]+arr[i]
                else:
                    sum[i]=arr[i]
                if sum[i]>max:
                    max=sum[i]
        return max
    

    源代码流程图

    测试代码

    选择条件组合覆盖:
    共有6个条件
    1.len(arr)=0
    2.len(arr)>0
    3.sum[i-1]>0
    4.sum[i-1]<=0
    5.sum[i]>max
    6.sum[i]<=max
    则条件组合判断为:

    • len(arr)=0
    • len(arr)>0,sum[i-1]>0,sum[i]>max
    • len(arr)>0,sum[i-1]>0,sum[i]<=max
    • len(arr)>0,sum[i-1]<=0,sum[i]>max
    • len(arr)>0,sum[i-1]<=0,sum[i]<=max
      设计的测试用例分别为以下所示:
    • arr0=[]
    • arr1=[-1,-2,-3,-4,-5,-6]
    • arr2=[1,2,3,4,5,6] #21
    • arr3=[-1,-2,-3,-4,-5,20]#20
    • arr4=[1,2,3,4,5,-20,6,-30]#15

    测试程序代码

    import unittest
    from maxsum import *
    arr0=[]
    arr1=[-1,-2,-3,-4,-5,-6]
    arr2=[1,2,3,4,5,6] #21
    arr3=[-1,-2,-3,-4,-5,20]#20
    arr4=[1,2,3,4,5,-20,6,-30]#15
    class TestMaxsum(unittest.TestCase):
        #test for maxsum
        def test0(self):
            self.assertEqual(0,maxsum(arr0))
        def test1(self):
            self.assertEqual(0,maxsum(arr1))
        def test2(self):
            self.assertEqual(21,maxsum(arr2))
        def test3(self):
            self.assertEqual(20,maxsum(arr3))
        def test4(self):
            self.assertEqual(15,maxsum(arr4))
    
    if __name__=='__main__':
        print()
        unittest.main()
    

    程序测试结果截图

    [程序测试截图][]

    ---恢复内容结束---

    总结

    要多加练习python语言以及markdown语法的使用

  • 相关阅读:
    UWP 2018 新版 NavigationView 尝鲜
    UWP 五星评价(不跳转到龟速商店)
    UWP 查找模板中的控件
    Win10版本号区分
    基于Windows 机器学习(Machine Learning)的图像分类(Image classification)实现
    海瑞菌的web前端学习直播间
    【javascript】对原型对象、原型链的理解
    公众号【海瑞菌】的近期总结
    我的2018年【年末总结】--2019年初计划
    【js操作url参数】获取指定url参数值、取指定url参数并转为json对象
  • 原文地址:https://www.cnblogs.com/liuch03/p/10737907.html
Copyright © 2011-2022 走看看