动态规划dp —— 22.乘积为正数的最长子数组长度

动态规划dp —— 22.乘积为正数的最长子数组长度_第1张图片

 1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

f[i]表示:以i位置元素为结尾的所有子数组中乘积为正数的最长长度

g[i]表示:以i位置元素为结尾的所有子数组中乘积为负数的最长长度

动态规划dp —— 22.乘积为正数的最长子数组长度_第2张图片

 

2.状态转移方程

i位置可分为两种情况:1.长度为1  2.长度大于1

f表

动态规划dp —— 22.乘积为正数的最长子数组长度_第3张图片

 动态规划dp —— 22.乘积为正数的最长子数组长度_第4张图片

 g表:动态规划dp —— 22.乘积为正数的最长子数组长度_第5张图片

 动态规划dp —— 22.乘积为正数的最长子数组长度_第6张图片

 

3.初始化

保证填表的时候不越界

创建一个虚拟节点,初始化为0

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了

从左往右,两个表一起填

5.返回值

题目要求+状态表示

f表里的最大值

6.填表

class Solution {
public:
    int getMaxLen(vector& nums) {
        int n = nums.size();
        //1.创建dp表
        vectorf(n+1);
        vectorg(n+1);
        //2.初始化
        //3.填表
        int ret = INT_MIN;
        for(int i = 1;i < n+1;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]<0)
            {
                f[i] = g[i-1] == 0?0:g[i-1] +1;
                g[i] = f[i-1] +1;
            }
            ret = max(ret,f[i]);
        }
        return ret;
        //4.返回值
    }
};

你可能感兴趣的:(动态规划,动态规划,算法)