这个题是两个子问题合在一起
因为存在负数,而且负负得正。那么dp[i]不能只存一个数,而是以位置i结尾的最大值跟最小值
所以拆分一下,分成两个数组。一个dp_max存位置i结尾的最大乘积,一个dp_min存位置i结尾的最小乘积
dp_max[i] 为前一位置dp_max[i] 或者dp_min[i] 跟nums[i]乘积的最大值。注意这里漏了一种情况,还需要考虑子数组仅保留nums[i]的情况。所以这个三个值取最大值。
dp_min[i]为三个值取最小值
答案是所有 dp_max[i] 取最大值
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int maxProduct(vector<int>& nums) {
// write code here
int n = nums.size();
if(n == 0){
return 0;
}
int dp_max[n];
int dp_min[n];
int res = nums[0];
dp_max[0] = nums[0];
dp_min[0] = nums[0];
for(int i=1;i<n;i++){
dp_max[i] = max(max(dp_max[i-1] * nums[i],dp_min[i-1] * nums[i]),nums[i]);
dp_min[i] = min(min(dp_max[i-1] * nums[i],dp_min[i-1] * nums[i]),nums[i]);
res = max(res,dp_max[i]);
}
return res;
}
};



京公网安备 11010502036488号