乘积最大子数组 【动态规划】

乘积最大子数组 【动态规划】

题目链接
题意:给出一个数组,要求一个子数组,使得子数组中所有元素乘积最大。

思路:最大值乘以一个负数之后可能变为最小值
   最小值乘以一个负数之后可能成为最大值

用maxx[i]记录以第i个元素结尾的子数组乘积最大值
用minn[i]记录以第i个元素结尾的子数组乘积最小值
于是有:
maxx[i]=max{maxx[i-1]*num[i],minn[i-1]*num[i],num[i]}
minn[i]=min{maxx[i-1]*num[i],minn[i-1]*num[i],num[i]}

代码如下:

#include <iostream>
#include<vector>
using namespace std;

int solution(vector<int> &nums){
    vector<int> minn(nums.size()+5);
    vector<int> maxx(nums.size()+5);
    minn[0]=1;
    maxx[0]=1;
    for(int i=1;i<=nums.size();i++){
        maxx[i]=max(maxx[i-1]*nums[i-1],minn[i-1]*nums[i-1]);
        maxx[i]=max(maxx[i],nums[i-1]);
        minn[i]=min(maxx[i-1]*nums[i-1],minn[i-1]*nums[i-1]);
        minn[i]=min(minn[i],nums[i-1]);
    }
    int ans=-0x3f3f3f3f;
    for(int i=1;i<=nums.size();i++){
        ans=max(ans,maxx[i]);
    }
    return ans;
}

int main()
{
    int n;
    cin>>n;
    vector<int> nums;
    int a;
    for(int i=0;i<n;i++){
        cin>>a;
        nums.push_back(a);
    }
    cout<<solution(nums)<<endl;
    return 0;
}

你可能感兴趣的:(算法题)