问题描述与解题思路
确定本题的状态表示
f[i]的含义是乘积为正数的以nums[i-1]为终点的最长子数组长度
g[i]的含义是乘积为负数的以nums[i-1]为终点的最长子数组长度
确定本题的状态转移方程


填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int n=nums.size();
vector<int> f(n+1,0),g(n+1,0);
int ret=0;
// f[i]的含义是乘积为正数的以nums[i-1]为终点的最长子数组长度
// g[i]的含义是乘积为负数的以nums[i-1]为终点的最长子数组长度
for(int i=0;i<n;i++){
if(nums[i]>0){
f[i+1]=f[i]+1;
if(g[i]>0) g[i+1]=g[i]+1;
}else if(nums[i]<0){
if(g[i]>0) f[i+1]=g[i]+1;
g[i+1]=f[i]+1;
}else{
// 此时nums[i]=0
f[i+1]=0;
g[i+1]=0;
}
// cout << "f["<< i+1<< "]="<< f[i+1]<< endl;
// cout << "g["<< i+1<< "]="<< g[i+1]<< endl;
if(f[i+1]>ret) ret=f[i+1];
}
return ret;
}
};
最长乘积正学子数组

587

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



