1.实践题目
最大子段和
2.题目描述
求出子段和的最大值,若最大值为负数,则最大值为0
3.算法描述
定义一个一维数组note[i],初始时存放的值为该序列,每次更新时记录以当前下标的值为子段末尾的子段和的最大值,最后用max记录所有子段和的最大值
int max=0;
for (int i = 1; i < n; i++)
note[i] = note[i - 1] > 0 ? note[i - 1] + note[i] : note[i];
for (int i = 0; i < n; i++)
if (note[i] > max) max = note[i];
4.算法时间及空间复杂度分析
该算法只需遍历一次该一维数组,所需时间为O( n ),且更新max所需时间为O(n),故时间复杂度为O(n );
需要一个大小为n的一维数组存储该序列,求解子问题时使用同一数组,故空间复杂度为O(n )。
5.心得体会
本道题输入动态规划里面比较简单的一道,没有太大的思维障碍,结队编程时主要是想要改进这个算法,后来我们发现一种空间复杂度为O(1)的算法,不需要note[i]数组,每次输入使用一个整型变量接收数值,每次计算完成再用max记录最大值即可,但考虑到该算法通用性不够强,最终不予使用,但也不失为一个好的思路。后来发现其实很多基于动态规划的算法有很多种变化的形式,甚至有许多改进的可能性存在,在做这类题目时,我们不应只局限于如何解决问题,更应该放眼于如何优化解题方案。