要求:
一个有n个元素的数组,这n个元素既可以是正数也可以是负数,数组中连续的一个或多个元素组成一个连续的子数组,求子数组和的最大值。例如数组[1,-2,4,8,-4,7,-1,-5],其最大和的子数组为[4,8,-4,7],最大值为15。
分析:
方法一:蛮力法
找出所有的子数组,然后求出子数组的和,在所有子数组的和中取最大值。
方法二:重复利用已经计算的子数组和
由于sum[i,j]=sum[i,j-1]+arr[j],在计算sum[i,j]的时候可以使用前面已经计算出的sum[i,j-1]而不需要重新计算,采用这种方法可以省去sum[i,j-1]的时间,因此可以提高程序效率。
方法三:动态规划方法
首先根据数组的最后一个元素arr[n-1]与最大子数组的关系分为以下三种情况讨论:
(1)最大子数组包含arr[n-1],即最大子数组以arr[n-1]结尾
(2)arr[n-1]单独构成最大子数组
(3)最大子数组不包含arr[n-1],那么求arr[1...n-1]的最大子数组可以转换为求arr[1...n-2]的最大子数组。
通过上述分析可得:假设已经计算出子数组arr[1...i-2]的最大子数组和all[i-2],同时也计算出arr[0...i-1]中包含arr[i-1]的最大子数组和为end[i-1]。则可以得到如下关系:all[i-1]=max(end[i-1],arr[i-1],all[i-2])。