动态规划:乘积为正数的最长子数组长度
题目描述
算法原理
状态定义
f[i] 表示以 i 位置为结尾的所有子数组中乘积为正数的最长长度。 g[i] 表示以 i 位置为结尾的所有子数组中乘积为负数的最长长度。
状态转移方程
当 nums[i] > 0 时:
- f[i] = f[i-1] + 1
- g[i] = g[i-1] == 0 ? 0 : g[i-1] + 1
当 nums[i] < 0 时:
- g[i] = f[i-1] + 1
- f[i] = g[i-1] == 0 ? 0 : g[i-1] + 1
初始化与返回值
在 f 表和 g 表前加虚拟节点初始化为 0,下标统一右移一位。填表顺序从左往右。返回值为 f 表里的最大值。
代码实现
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int n = nums.size();
vector<int> f(n + 1), g(n + 1);
int ret = INT_MIN;
for (int i = 1; i <= n; i++) {
if (nums[i - 1] > 0) {
f[i] = f[i - 1] + 1;
g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;
} else if (nums[i - 1] < ) {
g[i] = f[i - ] + ;
f[i] = g[i - ] == ? : g[i - ] + ;
}
ret = (ret, f[i]);
}
ret;
}
};


