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());
}
};