最后的结果是两种选择中取最大的一个,因此状态转移方程为: f[i] = max(nums[i], f[i - 1] *
nums[i]) 。
但是 nums 数组中包含有正数,负数和零,当前的最大值如果乘以一个负数就会变成最小值,当前的最
小值如果乘以一个负数就会变成一个最大值,因此我们还需要维护一个最小值。
新的状态表示:
f[i] 表示以 num[i] 结尾的连续子数组乘积的最大值, g[i] 表示以 num[i] 结尾的连续子数组乘积的
最小值。
我们先去讨论以 nums[i] 结尾的连续子数组的最大值的状态转移方程:
1、如果 nums[i] >= 0 ,同刚开始讨论的一样, f[i] = max(nums[i], f[i - 1] *
nums[i]) 。
2、如果 nums[i] < 0 ,只有 nums[i] 一个数,最大值为 nums[i] 。有多个数的话,问题就转化
成了以 nums[i - 1] 结尾的连续子数组的最小值再乘以 nums[i] (最小值乘以一个负数变成最大
值),即 f[i] = max(nums[i], g[i - 1] * nums[i]) 。
图示:
综上,最大值的状态转移方程为: f[i] = max(nums[i], max(f[i - 1] * nums[i], g[i - 1] *
nums[i])) 。
再去讨论以 nums[i] 结尾的连续子数组的最小值的状态转移方程:
1、如果 nums[i] >= 0 ,同最大值的思考方式一样,只需把 max 换成 min ,即 g[i] =
min(nums[i], g[i - 1] * nums[i]) 。
2、如果 nums[i] < 0 ,只有 nums[i] 一个数,最小值为 nums[i] 。有多个数的话,问题就转化
成了以 nums[i - 1] 结尾的连续子数组的最大值再乘以 nums[i] (最大值乘以一个负数变成最小
值),即 f[i] = min(nums[i], f[i - 1] * nums[i]) 。
图示: