Leetcode 152. 乘积最大子序列 DP

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

输入: [2,3,-2,4]
输出:
6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

状态转移方程:

maxm = max(maxm*nums[i],minm*nums[i],nums[i]);

minm = min(maxm*nums[i],minm*nums[i],nums[i]);

dp=max(dp,maxm);

class Solution {
public:
    int maxProduct(vector<int>& nums) 
    {
        int dp;
        int len=nums.size();
        if(len==1)
            return nums[0];
        int maxm,minm;
        dp=maxm=minm=nums[0];
        for(int i=1;i<len;i++)
        {
            if(nums[i]>=0)
            {
                maxm=max(maxm*nums[i],nums[i]);
                minm=min(minm*nums[i],nums[i]);
            }
            else  //如果nums[i]<0,相乘的时候maxm和minm需要相反乘
            {
                int tmp;
                tmp=maxm;
                maxm=max(minm*nums[i],nums[i]);
                minm=min(tmp*nums[i],nums[i]);
            }
            dp=max(dp,maxm);
        }  
        return dp;
    }
};

猜你喜欢

转载自blog.csdn.net/Evildoer_llc/article/details/88412676
今日推荐