乘积最大子数组 - 动态规划

func maxProduct(nums []int) int {
	n := len(nums)
	if n == 0 {
		return 0
	}
	// dp[i]: 以 i 结尾
	dp := [2]int{
		nums[0], // 子数组最大乘积
		nums[0], // 子数组最小乘积
		// 当前遍历到的元素为负,数组最小乘积也为负数,负负相乘等于最大乘积
	}
	ans := dp[0]
	for i := 1; i < n; i++ {
		dp = [2]int{
			max(nums[i], nums[i] * dp[0], nums[i] * dp[1]),
			min(nums[i], nums[i] * dp[0], nums[i] * dp[1]),
		}
		ans = max(ans, dp[0])
	}
 
	return ans
}