题目如标题,一个数组中求子数组和的最大值。
分析:
(1)数组全为非负数,则解为数组所有值的和。
(2)数组全为负数,则解为数组中最大的成员的值。
(3)数组含有负数和非负数,最普遍的情况。
解法:
1.技巧型,通过假设。假如我们要找的子数组即是和最大的,也是长度最长的。
那么这个数组应该满足以下性质:
(1)i至k(k<j)的任何一个数组,其和都应该不小于0。因为若小于零那就应该从k+1开始到j才能满足最大子数组的要求。
(2)以i-1为尾部的任一个数组,其和都应该小于0,同理。
所以我们运用一个cur来记录当前累加的情况,max来记录最大值。当cur小于0时,我们把cur重新设定为0。
2.动态规划,数组成员有两种选择,要么加入前面的子数组队列,要么自己另起炉灶。
转移方程 dp[i] = max(num[i],dp[i-1]+num[i]);