标签:
最大乘积子序列
思想:动态规划+最大最小数组
状态方程:考虑到负数,所以加上一个min。
max[i] = Max(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);
min[i] = Min(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]);
注意:max[i]是指包含当前nums[i]在内的最大乘积,并不一定是前i个数的最大乘积。同理min[i]。
所以最大乘积应该是max数组中的最大值,而不是max[size-1]。
class Solution { public: int Max(int a,int b,int c) { if(a>=b&&a>=c) return a; else if(b>=a&&b>=c) return b; else return c; } int Min(int a,int b,int c) { if(a<=b&&a<=c) return a; else if(b<=a&&b<=c) return b; else return c; } int maxProduct(vector<int>& nums) { int size = nums.size(); int* max = new int[size]; int* min = new int[size]; max[0] = nums[0]; min[0] = nums[0]; for(int i=1;i<size;i++) { int mx = Max(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]); int mi = Min(max[i-1]*nums[i],min[i-1]*nums[i],nums[i]); max[i]=mx; min[i]=mi; } int max_value=max[0]; for(int i=0;i<size;i++) { if(max[i]>max_value) max_value = max[i]; } return max_value; } };
标签:
原文地址:http://www.cnblogs.com/ZhangYushuang/p/4599355.html