题解
连续子序列最大乘积。和最大连续和有点相似,但差别明显。
大概也会用dp[ i ] 代表以 i 为终点的最大积?
不行因为数列中有负数,负数会瞬间改变前一位的最大积使之变最小。
观察到最大最小的这种即时变化,所以我们要把两者都进行记录。
cur_max = max( max( cur_max*nums[i], cur_min*nums[i] ),nums[i] );
cur_min = min( min( cur_max*nums[i], cur_min*nums[i] ), nums[i] );
如此遍历即可。
ps: dp题型非常活,转化思路因题而异。
Code
int maxProduct(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
int res,cur_max,cur_min;
res=cur_max=cur_min = nums[0];
for(int i=1;i<n;i++){
int tmp = cur_max;
cur_max = max( cur_max*nums[i], max(cur_min*nums[i],nums[i]) );
cur_min = min( tmp*nums[i], min(cur_min*nums[i],nums[i]) );
if(cur_max>res) res = cur_max;
}
return res;
}