乘积最大子数组

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());
    }
};
上一篇:01背包问题——动态规划 8.6


下一篇:C——语言快速比较函数fmax与fmin