以下用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)