最大积连续子序列问题
2011-10-12 00:00
344 查看
对于最大积问题:
由于负数的存在,我们不能简简单单只存一个当前最大值,我们还需要存当前最小值。
我们令F(n)表示[0,n]区间内以d
为结尾的最大积,令G(n)表示[0,n]区间内以d
为结尾的最小积,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]}
实际上,这个递推公式是重点。
由于负数的存在,我们不能简简单单只存一个当前最大值,我们还需要存当前最小值。
我们令F(n)表示[0,n]区间内以d
为结尾的最大积,令G(n)表示[0,n]区间内以d
为结尾的最小积,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]}
实际上,这个递推公式是重点。
/// <summary> /// 求解最大子段积,返回结果以及最优解的始末下标 /// </summary> /// <param name="seq">输入序列</param> /// <param name="beginIndex">返回最优解的起始下标</param> /// <param name="endIndex">返回最优解的结束下标</param> /// <returns>最大子段积</returns> public static long MaxSubMul(int[] seq, out int beginIndex, out int endIndex) { if (seq == null || seq.Length == 0) throw new ArgumentNullException("输入序列不能为空"); long maxMul = seq[0]; beginIndex = endIndex = 0; long curMaxMul = seq[0], curMinMul = seq[0]; int curMinBeginIndex = 0, curMaxBeginIndex = 0; for (int i = 1; i < seq.Length; i++) { long a = curMaxMul * seq[i], b = curMinMul * seq[i]; long max, min; int tmpMaxBeginIndex, tmpMinBeginIndex; if(a > b) { max = a; min = b; tmpMaxBeginIndex = curMaxBeginIndex; tmpMinBeginIndex = curMinBeginIndex; } else { max = b; min = a; tmpMaxBeginIndex = curMinBeginIndex; tmpMinBeginIndex = curMaxBeginIndex; } if (seq[i] > max) { curMaxBeginIndex = i; curMaxMul = seq[i]; } else { curMaxBeginIndex = tmpMaxBeginIndex; curMaxMul = max; } if (seq[i] < min) { curMinBeginIndex = i; curMinMul = seq[i]; } else { curMinBeginIndex = tmpMinBeginIndex; curMinMul = min; } if (curMaxMul > maxMul) { maxMul = curMaxMul; beginIndex = curMaxBeginIndex; endIndex = i; } } return maxMul; }
相关文章推荐
- 经典 - 最大和/最大积连续子序列问题
- 最大子序列和问题
- Common Subsequence 最大公共子序列问题
- 最大子序列和问题
- 最大子序列和问题
- 最大子序列和问题
- 连续子序列最大和问题的分析
- 【每周至少一篇 160819】最大子序列和问题的四种求法_Java
- 序列最大和分割、最大距离、滑动窗口最大值问题
- hdu1160 最大上升子序列问题+输出路径
- 最大子序列问题
- 最大子序列和问题
- (转)最大子序列和问题 看着貌似不错
- 最大子序列和问题
- [转] 最大子序列和问题
- 最大子序列和问题
- hdu 1422 最大子序列和问题的变形,最长非负子序列
- 算法学习之最大子序列问题
- 《数据结构与算法分析》笔记------第二章、最大子序列和问题的解
- 最大子序列和问题