这个题是两个子问题合在一起
因为存在负数,而且负负得正。那么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; } };