主程序将数组分割成若干个不含0的子数组,从而使的子数组的乘积不会是0. 在分割过程中,为了方便把正数用1表示,负数用0表示。
函数ml意为一个不含0的数组ll的乘积为正数的最长连续子数组点长度max_len。这又可以按ll中有多少负数分成三种情况:
Case 1:含有偶数个负数,全部乘起来一定是正数;
Case 2:含有1个负数,把数组分割成前后两段,哪段长那段就是乘积为正数的最长连续子数组;
Case 3:含有奇数个负数且把数组分割成至少四段,这时要么舍弃第一段、要么舍弃最后一段不加入我们想要的乘积为正数的最长连续子数组,哪段短就舍弃哪段。
# negative number index
ni = [i for i in range(len(ll)) if ll[i] == 0]
if len(ni)%2 == 0:
return len(ll)
elif len(ni) == 1:
return max(len(ll)-ni[0], ni[0])
elif len(ni)%2 == 1:
return max(ni[-1],len(ll)-ni[0]-1)
input()
nn = list(map(int, input().split()))+[0]
res,nl = 0,[[]]
# Split nn (list) into nl (list of lists) with 0 as separater
for n in nn:
if n>0:
nl[-1].append(1)
elif n<0:
nl[-1].append(0)
elif n==0:
nl.append([])
for l in nl:
res = max(res, ml(l))
print(res)