1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
因为要考虑负数情况,负数乘以最大数就等于最小数了,负数乘以最小数就是最大数了
f[i]表示:以i位置为结尾的所以子数组中最大乘积
g[i]表会:以i位置为结尾的所以子数组中最小乘积
2.状态转移方程
分为两种情况:1.长度为1 2.长度大于1
f[i] = max(nums[i] , f[i-1] * nums[i] , g[i-1] * nums[i])
f[i] = min(nums[i] , f[i-1] * nums[i] , g[i-1] * nums[i])
3.初始化
保证填表的时候不越界
用加一个虚拟节点的方法
1.里面的值要保证后续填表是正确的
2.注意下标的映射关系
为了不影响结果,第一个位置填1
f[0] = g[0] = 1;
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
从左往右,两个表一起填
5.返回值
题目要求+状态表示
f表里的最大值
6.代码
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n = nums.size();
//1.创建dp表
vector<int> f(n+1);
vector<int> g(n+1);
//2.初始化
f[0] = g[0] = 1;
//3.填表
for(int i = 1;i < n+1; i++)
{
f[i] = max(nums[i-1] ,max( f[i-1] * nums[i-1] , g[i-1] * nums[i-1]));
g[i] = min(nums[i-1] ,min( f[i-1] * nums[i-1] , g[i-1] * nums[i-1]));
}
//4.返回值
int ret = INT_MIN;
for(int j = 1; j < n+1;j++)
{
ret = max(ret , f[j]);
}
return ret;
}
};