其他分享
首页 > 其他分享> > 乘积最大子数组

乘积最大子数组

作者:互联网

f[i]以a[i]结尾的最大的子序列的和
状态转移方程:
fmax = max(fmax[i - 1] * a[i], max(a[i], fmin[i - 1] * a[i]));
fmin = min(fmin[i - 1] * a[i], min(a[i], fmax[i - 1] * a[i]));
如果当前a[i] > 那么最大值就是f[i - 1] * a[i]
如果当前a[i] < 0 那么f[i]就等于1~i中乘积是负数的最小的一段(使用fmin来维护)乘以当前a[i]
如果a[i] = 0,那么f[i]就只能是0
所以f[i] 就是上面三段的最大值f[i] = max(f[i - 1] * a[i], max(a[i], fmin[i - 1] * a[i]);
原理链接

class Solution {
public:
    int maxProduct(vector<int>& a) {
        vector<int> maxf(a), minf(a);
        for(int i = 1; i < a.size(); i ++)
        {
            maxf[i] = max(maxf[i - 1] * a[i], max(a[i], minf[i - 1] * a[i]));
            minf[i] = min(minf[i - 1] * a[i], min(a[i], maxf[i - 1] * a[i]));
        }
        return *max_element(maxf.begin(), maxf.end());
    }
};

标签:乘积,min,fmax,max,数组,minf,fmin,maxf,最大
来源: https://www.cnblogs.com/jw-zhao/p/15138642.html