以下用maxnum表示以x结尾的连续子数组中乘积最大者。minnum同理。用res持续maxnum迭代过程中取到的最大值。

以x.next结尾的连续子数组的乘积除以x.next一定是1或者某个以x结尾的连续子数组的乘积,从而在minnum和maxnum之间并且不等式的两个端点都可以取到。因此,新的maxnum一定是x * maxnum (若x>0,maxnum>0)或者 x * minnum (若x<0)或者 x (若maxnum<0,x>0)。这就形成了动态规划的迭代步骤。

nums = list(map(int, input().split()))
res = nums[0]
maxnum = minnum = nums[0]
if n == 1:
    print(nums[0])
else:
    for x in nums[1:]:
        n1, n2 = x * maxnum, x * minnum
        maxnum = max(n1, n2, x)
        minnum = min(n1, n2, x)
        if res < maxnum:
            res = maxnum
    print(res)