Given an integer array `nums`, find a contiguous non-empty subarray within the array that has the largest product, and return the product.
Dynamic Programming (Dual-State)
Because of negative numbers, the minimum product can suddenly become the maximum product when multiplied by another negative number. Thus, we must track both the maximum AND the minimum product ending at the current position. For each number, the new `max` and `min` could be chosen from: the number itself, `num * currentMax`, or `num * currentMin`.