题目描述:

给定一个长度为N的整数数组,只允许用乘法,计算任意(N-1)个数的组合中乘积最大的一组。


算法分析:

            动态规划的做法,假设数组为a[N],max[N]表示以下标为i结尾的子数组乘积最大值,min[N]表示以下标为i结尾的子数组乘积最小值。为了处理数组元素为负的问题,必须将最小乘积也保存起来。

           很容易想到,若当前元素a[i]为负数,那么a[i]*max[i-1]得到的值并不一定比a[i] * min[i-1]大,因为min[i-1]可能为负,如果min[i-1]的绝对值大于max[i-1],那么a[i] * min[i-1]负负相乘的值则更大。因此有以下转移方程

求三者最大

max[i] = MaxinThree(a[i], a[i]*max[i-1], a[i]*min[i-1])

求三者最小

min[i] = MininThree(a[i], a[i]*max[i-1], a[i]*min[i-1])


C#代码实现:

求最大子数组之积



摘自:微信公众号:燕哥带你学算法(Jeemy110

原文链接:点击打开链接


相关文章: