题目链接:leetcode152
思路:注意这里的子序列是子数组的意思!! d p [ i ] dp[i] dp[i]表示以下标i为结尾的最值,由于乘法的缘故,只要乘以一个数均可能成为后面最大值的贡献子段,所以要存一个最大乘积和最小乘积,意在把之前的绝对值最大的乘积子段存下来,以后当遇到一个负数就可以考虑由那个绝对值最大的状态传递过来。注意每个段可能由于之前是0,另起一段,所以也要考虑这个状态的计算。故维护最大值和最小值的dp均要进行两次计算,并维护一个全局最大的ret避免计算结束后还要去扫一遍。
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n=nums.size();
if(n == 0) return 0;
int ret;
int MAX[n]={0}, MIN[n]={0}; //以i为结尾的乘积最值
ret=MAX[0]=MIN[0]=nums[0];
for(int i=1; i<n; i++) {
MAX[i]=max(MIN[i-1]*nums[i], MAX[i-1]*nums[i]); MAX[i]=max(MAX[i], nums[i]);
MIN[i]=min(MAX[i-1]*nums[i], MIN[i-1]*nums[i]); MIN[i]=min(MIN[i], nums[i]);
ret=max(ret, MAX[i]);
}
return ret;
}
};