题目描述:
给定一个长度为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)
原文链接:点击打开链接