题意:最大子段乘积。
解法:一开始按最大子段和写了一个……果断挂了……因为负数乘以负数会变正不像加法会越加越少,所以我就把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; } };