这个题是两个子问题合在一起
因为存在负数,而且负负得正。那么dp[i]不能只存一个数,而是以位置i结尾的最大值跟最小值
所以拆分一下,分成两个数组。一个dp_max存位置i结尾的最大乘积,一个dp_min存位置i结尾的最小乘积
dp_max[i] 为前一位置dp_max[i] 或者dp_min[i] 跟nums[i]乘积的最大值。注意这里漏了一种情况,还需要考虑子数组仅保留nums[i]的情况。所以这个三个值取最大值。
dp_min[i]为三个值取最小值
答案是所有 dp_max[i] 取最大值
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int maxProduct(vector<int>& nums) {
        // write code here
        int n = nums.size();
        if(n == 0){
            return 0;
        }
        int dp_max[n];
        int dp_min[n];
        int res = nums[0];
        dp_max[0] = nums[0];
        dp_min[0] = nums[0];
        for(int i=1;i<n;i++){
            dp_max[i] = max(max(dp_max[i-1] * nums[i],dp_min[i-1] * nums[i]),nums[i]);
            dp_min[i] = min(min(dp_max[i-1] * nums[i],dp_min[i-1] * nums[i]),nums[i]);
            res = max(res,dp_max[i]);
        }
        
        return res;
    }
};