题目描述:

方法1:动态规划,dp_max与dp_min 分别表示遍历 i 时,以 i 结尾的子数组最大乘积和最小乘积

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int dp_max = nums[0];
        int dp_min = nums[0];
        int n = nums.size();
        int m = nums[0];
        for(int i=1;i<n;i++){
            dp_max = max(nums[i] * dp_max,max(nums[i] * dp_min, nums[i]));
            dp_min = min(nums[i] * dp_max,min(nums[i] * dp_min, nums[i]));
            m = max(m,dp_max);
        }
        return m;
    }
};

出现错误:

原因:dp_min 使用了更新后的 dp_max 来更新,应该用更新前的 dp_max 来更新

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int dp_max = nums[0];
        int dp_min = nums[0];
        int n = nums.size();
        int m = nums[0];
        for(int i=1;i<n;i++){
            int temp = dp_max;
            dp_max = max(nums[i] * dp_max,max(nums[i] * dp_min, nums[i]));
            dp_min = min(nums[i] * temp,min(nums[i] * dp_min, nums[i]));
            m = max(m,dp_max);
        }
        return m;
    }
};