问题描述与解题思路

确定本题的状态表示
由于数组中可能存在负数,负数乘以负数会得到正数,因此需要同时维护当前最大值和当前最小值(因为最小值乘以负数可能变成最大值)。
f
[
i
]
f[i]
f[i] 表示:以
i
i
i 位置为结尾的所有子数组中最大乘积
g
[
i
]
g[i]
g[i] 表示:以
i
i
i 位置为结尾的所有子数组中最小乘积
如何理解 以
i
i
i 位置为结尾的所有子数组?

确定本题的状态转移方程
根据已知条件:
本题的状态转移方程:

填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n=nums.size();
vector<int> f(n+1),g(n+1);
f[0]=g[0]=1;
int ret=nums[0];
for(int i=0;i<n;i++){
f[i+1]=max({nums[i],nums[i]*f[i],nums[i]*g[i]});
g[i+1]=min({nums[i],nums[i]*f[i],nums[i]*g[i]});
if(f[i+1]>=ret) ret=f[i+1];
// cout <<"f["<<i+1<<"]: "<< f[i+1]<< endl;
// cout <<"g["<<i+1<<"]: "<< g[i+1]<< endl;
}
return ret;
}
};
706

被折叠的 条评论
为什么被折叠?



