算法第三章上机实践报告
1.实践题目
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
2.问题描述
题目要求时间复杂度为O(n),所以只能用一个for循环解决问题,要用到动态规划的算法。
3.算法描述
动态规划递归式为b[j]=max{b[j-1]+a[j],a[j]}(1<=j<=n)定义变量b作为一个动态的子段和,从第一个数开始到最后一个数。每循环判断下一个数,若大于0,最大子段和有可能包括它,则相加,若小于等于0,最大子段和不包括它。另外定义一个变量sum存储最大子段和,每次for循环最后判断当前子段和是否为当前最大子段和。这样动态存储就不用额外用一个数组b,使代码更加简洁。
4.算法时间及空间复杂度分析(要有分析过程)
时间复杂度:只有一个for循环 故T(n)=O(n)
空间复杂度:所需要的存储空间为与序列a[]等大 故S(n)=O(n)
5.心得体会(对本次实践收获及疑惑进行总结)
动态规划的代码很简短,效率很高。这需要我们在解决问题前很好的分析问题,尽可能的简化代码。一开始对b和sum起的作用不理解,后来在同伴的讲解下才明白。只有理解方法,才能用代码实现出来。结对编程帮助我更容易理解代码,学习同伴的长处,对自己的薄弱的编程能力也有所提高。