原文:
http://fayaa.com/tiku/view/56/
对于一个包含了正负整数的数组,求其“最大和”连续子序列 以及 “最大积”连续子序列
比如:
3 -4 8 -5 2 6 -7
最大和子序列是:8 -5 2 6,和为11
最大积子序列是:3 -4 8 -5 2 6,积自己算:)
-
对于最大和问题:
我们令F(n)表示[0,n]区间内以d[n]为结尾的最大和,d为原序列,那么有:
F(n + 1) = Max{d[n + 1],F(n) + d[n + 1]} = d[n + 1] + Max{0, F(n)} -
对于最大积问题:
由于负数的存在,我们不能简简单单只存一个当前最大值,我们还需要存当前最小值。
我们令F(n)表示[0,n]区间内以d[n]为结尾的最大积,令G(n)表示[0,n]区间内以d[n]为结尾的最小积,d为原序列,那么有:
F(n + 1) = Max{F(n) * d[n + 1], d[n + 1], G(n) * d[n + 1]}
G(n + 1) = Min{F(n) * d[n + 1], d[n + 1], G(n) * d[n + 1]}
代码如下:
最大子段和结果为:
11
最优序列为:
8 -5 2 6
最大子段积结果为:
5760
最优序列为:
3 -4 8 -5 2 6