leetcode 152 Maximum Product Subarray
题意:最大子段乘积。
解法:一开始按最大子段和写了一个……果断挂了……因为负数乘以负数会变正不像加法会越加越少,所以我就把dp变成二维数组,第一维表示以第i个数结尾的子段积中为正数的最大的值,第二维表示以第i个数结尾的子段积中为负数的绝对值最大的值,dp方程就是按正负相乘的规则讨论一下就可以了……具体看代码。
代码:
class Solution {
public:
int maxProduct(vector<int>& nums) {
vector<int> dp[2];
dp[0].push_back(1);
dp[1].push_back(1);
int ans = INT_MIN;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > 0) {
dp[0].push_back(max(nums[i], nums[i] * dp[0][i]));
dp[1].push_back(min(nums[i], nums[i] * dp[1][i]));
}
else {
dp[0].push_back(max(nums[i], nums[i] * dp[1][i]));
dp[1].push_back(min(nums[i], nums[i] * dp[0][i]));
}
ans = max(ans, dp[0][i + 1]);
ans = max(ans, dp[1][i + 1]);
}
return ans;
}
};

浙公网安备 33010602011771号