题解 | #连续子数组的最大乘积#

连续子数组的最大乘积

https://www.nowcoder.com/practice/fd8c819c07c9493887bfac8549c119f4

思路:动态规划

和上一题的最大子数组和不同的是,这题为最大乘积,所以要额外保存每次的一个最小值,规避负负得正的情况。

1. 确定dp数组代表的含义
    dp_max[i]:以下标 i 结尾的连续子数组的最大乘积
    dp_min[i]:以下标 i 结尾的连续子数组的最小乘积,保留最小负值
2. 确定递推公式
    dp_max[i] = max(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
    dp_min[i] = min(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
3. 初始化
    dp_max初始化为最小值 -inf,dp_min初始化为最大值 inf
    dp_max[0] = nums[0]
    dp_min[0] = nums[0]

代码:
n = int(input())
nums = list(map(int, input().split()))

dp_max = [float('-inf')] * n
dp_min = [float('inf')] * n
dp_max[0] = dp_min[0] = nums[0]
for i in range(1, n):
    dp_max[i] = max(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
    dp_min[i] = min(dp_max[i-1]*nums[i], dp_min[i-1]*nums[i], nums[i])
    
print(max(max(dp_max), max(dp_min)))



全部评论

相关推荐

09-26 19:45
门头沟学院 Java
点赞 评论 收藏
分享
10-29 18:20
济南大学 Java
王233:名字说一下
点赞 评论 收藏
分享
评论
11
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务