1、题目描述
输入一个有正有负的数组,返回subarray乘积最大的值。
2、思路
动归。
dp1保存着以每个元素结尾的正的最大乘积,没有正的就是0;
dp2保存着以每个元素结尾的负的最小乘积,没有负的就是0;
遍历数组,对于数字是正还是负,有不同的状态转移方程。
遍历dp1,找出最大值,如果最大值是0,则可能是数组元素全是负的,
再去dp2里找出最大值。
3、代码
int maxProduct(vector<int>& nums) {
int n = nums.size();
int dp1[n+1],dp2[n+1];
dp1[0]=0;
dp2[0]=0;
int ans = INT_MIN;
for(int i=1;i<=n;i++){
if(nums[i-1]>=0){
dp1[i]=max(nums[i-1],dp1[i-1]*nums[i-1]);
dp2[i]=dp2[i-1]*nums[i-1];
}
else{
dp1[i]=dp2[i-1]*nums[i-1];
dp2[i]=min(nums[i-1],dp1[i-1]*nums[i-1]);
}
}
for(int i=1;i<=n;i++){
if(dp1[i]>ans)
ans=dp1[i];
}
if(ans==0){
ans = INT_MIN;
for(int i=1;i<=n;i++){
if(dp2[i]>ans)
ans=dp2[i];
}
}
return ans;
}